论坛首页 Java企业应用论坛

可恶的NullPointerException与JVM的失职

浏览 18599 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-21  
java9981 写道
kaka2008 写道
datuo 写道
也与编程习惯有关。
比如经常字符串比较值的时侯
object.equals("")
为了避免空指针异常可以写成为:
"".equals(object)


这个。。。
这个还用说?

不喜欢这种写法,当然,这纯属个人爱好。
原因是:表义不明
面向对象的程序就应该用对象的角度写代码,
我们要测试的对象是object不是"",
我宁愿写成object!=null && object.equals("")


对于String来说一般写成object!=null && object.length > 0
这样效率比equals好,length不需要计算。
0 请登录后投票
   发表时间:2008-11-24  
真不明白,你要的这些,在异常栈信息里面不是都有?

而且,nullpoint是一个vm指令级别的错误,和一般我们包装好的,包含文字信息的错误可不同。

另外,‘带回变量名’,这更没办法了,经过编译,什么变量,都变成指针偏移量和常量了。

0 请登录后投票
   发表时间:2008-11-25  
NullPointerException, ClassCastException,IndexOutOfBoundsException,这些RuntimeException都会经常发生的,但这些不可怕,关键是:
1. 养成良好的编程习惯,
2. 好的logger机制
3. 好的exception处理机制。

最讨厌有人写程序时把所有异常都捕获,简单打一句错误信息,异常不再抛出,搞得外部调用者不知道错在哪里。
0 请登录后投票
   发表时间:2008-11-25   最后修改:2008-11-25
jeff.chuh 写道
javaeyebird 写道
jeff.chuh 写道
由于程序的不严密而出现NullPointerException异常的代码太常见了,
虽然可以在使用对象前检查是否为空,但过多的这种检查会使代码臃肿。
出现这样的异常的时候常常没有明确的信息,给调试带来不便,
即使知道抛出异常的代码行号,但或许因为你手头没有代码,或许因为这行代码有多次方法调用,
而很难得到错误的原因或是判断究竟什么对象是空。

我觉得这是JVM的失职,它只是抛出了没有任何信息的
NullPointerException,
为什么不追加“调用XXX方法时,发现对象不可用”的信息呢

为什么必须要单独给NullPointerException加上“调用XXX时”呢?其他的Exception不需要加么?
因为从stack trace中就能得到方法调用的信息
try { ... } catch (Exception e) {
  log.debug(e); // 或者简单地e.printStackTrace()
}



只能得到某个方法执行到第几行的时候出现了NullPointerException,
而不知道那行代码究竟是什么,比如执行XX对象的XX方法这样的信息没有。



难道一定要依赖这样明确的信息你才有能力对自己编写的代码进行调试吗?这是最基本最基本的基本功了吧。
0 请登录后投票
   发表时间:2008-11-27  
对于obj.a().b().c()的情况,可以分成以下两类来看
1.方法返回的是this,比如common-tuils包下的
new EqualsBuilder()
    .append(a.p1,a.p2)
    .append(a.s1,a.s2)
    .isEqual();
这只是一种风格,个人觉得没什么问题。

2.不同的方法返回的是不同的对象,比如
public void deleteRegion(){
    this.getDepartment().getRegion().delete();
}
这种情况理论上是不建议使用的。因为从OO的角度来看,该方法涉及到了太多的东西造成一定的耦合性。

对于空指针的异常,一般系统会有一些基于约定的编程规范,比如所有返回集合的方法不允许直接抛null而应该返回一个空的集合对象。这样可以避免调用者做这种null的判断,从而让我们的领域层只关注业务逻辑的实现。

至于null模式,感觉有点小题大作了。
0 请登录后投票
论坛首页 Java企业应用版

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