论坛首页 入门技术论坛

不小心犯的一个空指针错误

浏览 7689 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-06-19  
自己对于这个JAVA传值还真的不是很清楚
多谢LZ和回答的朋友了
0 请登录后投票
   发表时间:2010-06-19  
在方法内部修改外部变量的引用地址,又没有把外面的修改掉,当然会出现空指针异常了,这是正常的,
0 请登录后投票
   发表时间:2010-06-19  
有些朋友理解错了
1.传递进去的时候就是一个null,在read的时候new出来的和那个成员变量没有任何关系。所以这里和值传递之类的没有太大的关系
2.把代码改成这样子就明了了
public class Model {
static ArrayList<String> list;

static void read(ArrayList<String> lista) {
if (lista == null) {
lista = new ArrayList<String>();
}
lista.add("Hello");

}

public static void main(String[] args) {
list = new ArrayList<String>();
list.add("hh");
Model.read(list);
System.out.println(list.size());
}
}
0 请登录后投票
   发表时间:2010-06-19   最后修改:2010-06-19
以前搞c/c++的?java应该不提倡这种写法的
0 请登录后投票
   发表时间:2010-06-19  
这种错误有一个专有名词:遮蔽(shadow)
0 请登录后投票
   发表时间:2010-06-19   最后修改:2010-06-19
说实在,写了这么久JAVA,还真是没碰到楼主说的这种问题,不过我是这么理解的,这首先是一个运行时的错误,因此没有编译上的问题,起码我的eclipse没有显示有啥错误的,运行时调用了类的静态方法,将参数传进去,此时传进去的对象域因为没有实例化,因此其实是传了NULL给调用的方法的,其实相当于调用了Model.read(null),此时是否在方法里做实例化已与原来的变量引用没有关系了,因为再调用其方法就产生了空指针异常。
可以通过J-catTeam的例子或是在类中直接实例化该list:如下
public class Model {
static ArrayList<String> list = new ArrayList<String>();

static void read(ArrayList<String> lista) {
if (lista == null) {
lista = new ArrayList<String>();
}
lista.add("Hello");

}

public static void main(String[] args) {
Model.read(list);
System.out.println(list.size());
}
}
依然是运行是将对象的域传给方法,但此时因为该域有引用的实例,因此此时会将对象地址传给该方法,在方法中做了数据添加,再回来输出时也可正常看到显示数目为1。
另我似乎一直认为JAVA方法调用时传的是对象的地址,上面有挺多人认为是值传递的,可否举一下例子呢???
不过说实在我自己一般不会用楼主的这种编码方式,挺别扭的,其实我最近也遇到一个空指针问题,代码如下:
int var;
if(object != null) {
   var = object.getField();
}
这么一个语句出现空指针异常,看了半个小时及DEBUG才发现,方法调用的时候返回的是一个Integer对象,被赋予int变量时需要内部调用方法进行转换,但此时刚好返回的Integer对象为空,因此导致空指针异常,因为原代码var的声明与该异常出现的代码较远,不像现在我直接放在一起,因此当时也时看了挺久才发现的,呵呵
0 请登录后投票
   发表时间:2010-06-20   最后修改:2010-06-20
不就是调用静态方法时 ArrayList还没有实例化吗?就像THINK IN JAVA里讲的  你拿着遥控器,却没有电视机,你怎么用?  怎么扯到值传递上去了,再说JAVA只有值传递吗?
0 请登录后投票
   发表时间:2010-06-20  
不就是调用静态方法时 ArrayList还没有实例化吗?就像THINK IN JAVA里讲的  你拿着遥控器,却没有电视机,你怎么用?  怎么扯到值传递上去了,再说JAVA只有值传递吗?
他这里的意思是...LIST是NULL的.因为JAVA是值传递的.方法中的LIST与传入的LIST(NULL)是完全搭不上关系的.因为传入的参数LIST本来就是NULL.方法内的LIST初始化不等于方法外的LIST初始化.
0 请登录后投票
   发表时间:2010-06-20  
main中操作的是全局的list,而read中操作的是局部的list.这两个对象并不是同一个,必然会报错.
0 请登录后投票
   发表时间:2010-06-20  
这种艾斯比写法 明显就是懂啊不懂的水货瞎写
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics