关于JAVA 声明数组报错的问题

第一个问题:packagetestdemo;publicclassSongDemo1{publicstaticvoidmain(String[]args){inta[]=... 第一个问题:
package testdemo;
public class SongDemo1{
public static void main(String []args){
int a []=new int[2];
a[0]=1;
a[1]=2;
a[2]=3;
}
}
这个代码不会报错,但是我声明了数组长度为2啊,int a []=new int[2];,为什么当我给这个数组赋3个值时不报错?!

第二个问题:
为什么我在非方法中,也就是直接在类中声明数组:

package testdemo;
public class SongDemo1{
int a []=new int[2]; //这里会报错!!!
a[0]=1;
a[1]=2;
}

改为如下就对了 为什么!?:
package testdemo;
public class SongDemo1{
int a []=new int[2];
{
a[0]=1;
a[1]=2;
}
}
??????????
展开
 我来答
相知有术
2014-04-16 · TA获得超过311个赞
知道小有建树答主
回答量:174
采纳率:0%
帮助的人:175万
展开全部
第一个问题:
数组长度你定念滑义的是2,但是,你却对三陆逗个数组成员赋值,也就是说,a[2]是不存在的,new int[2]只有a[0]和a[1]两个成员,数组脚标越界了。

第二个问题:
你定义数组的地方,是成员位置,int a []=new int[2]; 这句并没有仔悉腊错,数组是可以定义在成员位置的,但是,后面的两句对数组成员赋值,要写在方法中。

进5044群5871,求个采纳
追问
第一个问题,确实越界了,我就是想知道为什么不报错?

第二个问能帮我详细说明下吗,为什么数组赋值要在方法中?一般在类中不是也可以直接给一个变量赋值的吗?

谢谢
追答
第一个问题,数组脚标越界异常,和空指针异常一样,是属于RuntimeException的子类,也就是运行时异常,所以,他在编译阶段不会报错。

第二个问题,你的数组声明在成员位置上,而且明确创建了数组对象int a []=new int[2];,此时,虚拟机会自动对数组进行隐式的初始化动作,也就是所有的元素都初始化为0,但是,你还想同时在成员位置上对数组元素初始化,这就不行,对数组元素执行显示初始化,属于执行语句,而不是声明语句,执行语句必须放在方法体内部或者代码块中,要么,你就把int a []=new int[2];改成int[] a ={0,1,}这种。这样说不知道你能不能理解,去年我也思考过这个问题,如果你那时候问,我的思路更清晰一些,回答的也会好一些,如果不能理解,就进5044群5871讨论吧,现在正在讨论这事
帐号已注销
2014-04-17 · 超过15用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:31.4万
展开全部
public class SongDemo1{
int a []=new int[2]; //这里会报错!!!
a[0]=1;
a[1]=2;
}
这里是在编译时就报错了,证明是语法上的错误。
在加载类的时候,java会对类中的静态属孙绝性进行默认初始化和显式初始化;在新建类对象的时候,java会对类中的非静态属性进行默认初始化和显式初始化。
这里报错的原因我想喊宽大致是这样的:在java中,运算都是在栈内存进行的,则渗姿而对象、数组都是存在于堆内存中的,对于数组的赋值(在默认初始化和显式初始化之后)应该是由栈内存中的方法来实现的。
因为我没有这样写过,所以以上都是猜测,希望能帮助到你
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友a5e509c
2014-04-17 · TA获得超过510个赞
知道小有建树答主
回答量:516
采纳率:76%
帮助的人:146万
展开全部
数组是可以动态添加元素的并且可以有一个key值为空所以a[2]=2不报错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式