`
jeff.chuh
  • 浏览: 2780 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

可恶的NullPointerException与JVM的失职

阅读更多
由于程序的不严密而出现NullPointerException异常的代码太常见了,
虽然可以在使用对象前检查是否为空,但过多的这种检查会使代码臃肿。
出现这样的异常的时候常常没有明确的信息,给调试带来不便,
即使知道抛出异常的代码行号,但或许因为你手头没有代码,或许因为这行代码有多次方法调用,
而很难得到错误的原因或是判断究竟什么对象是空。

我觉得这是JVM的失职,它只是抛出了没有任何信息的NullPointerException,
为什么不追加“调用XXX方法时,发现对象不可用”的信息呢
分享到:
评论
64 楼 long_biti 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模式,感觉有点小题大作了。
63 楼 xixix2004 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方法这样的信息没有。



难道一定要依赖这样明确的信息你才有能力对自己编写的代码进行调试吗?这是最基本最基本的基本功了吧。
62 楼 chenkan2000 2008-11-25  
NullPointerException, ClassCastException,IndexOutOfBoundsException,这些RuntimeException都会经常发生的,但这些不可怕,关键是:
1. 养成良好的编程习惯,
2. 好的logger机制
3. 好的exception处理机制。

最讨厌有人写程序时把所有异常都捕获,简单打一句错误信息,异常不再抛出,搞得外部调用者不知道错在哪里。
61 楼 leadyu 2008-11-24  
真不明白,你要的这些,在异常栈信息里面不是都有?

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

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

60 楼 jeff.chuh 2008-11-21  
java9981 写道
kaka2008 写道
datuo 写道
也与编程习惯有关。
比如经常字符串比较值的时侯
object.equals("")
为了避免空指针异常可以写成为:
"".equals(object)


这个。。。
这个还用说?

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


对于String来说一般写成object!=null && object.length > 0
这样效率比equals好,length不需要计算。
59 楼 java9981 2008-11-21  
kaka2008 写道
datuo 写道
也与编程习惯有关。
比如经常字符串比较值的时侯
object.equals("")
为了避免空指针异常可以写成为:
"".equals(object)


这个。。。
这个还用说?

不喜欢这种写法,当然,这纯属个人爱好。
原因是:表义不明
面向对象的程序就应该用对象的角度写代码,
我们要测试的对象是object不是"",
我宁愿写成object!=null && object.equals("")
58 楼 java9981 2008-11-21  
支持lz,虽然我觉得问题没那么严重,如果出现很多NullPointerException的话,
那应该考虑增加参数的检查,一般参数都是跟业务有关的,应该返回跟业务相关的错误代码,
而不应该要求jvm帮你处理了,业务相关的东西还是手工写吧。
jvm给的出错信息的确很不足,遇到NullPointerException的话jvm肯定是知道要调用哪个类的哪个方法,
完全可以把这些信息打印出来的,这根本就不会有速度上的影响。
而且使用的那个变量,如果有变量名的话完全可以给出变量名的。
57 楼 javaeyebird 2008-11-21  
jeff.chuh 写道
javaeyebird 写道
为什么必须要单独给NullPointerException加上“调用XXX时”呢?其他的Exception不需要加么?
因为从stack trace中就能得到方法调用的信息
try { ... } catch (Exception e) {
  log.debug(e); // 或者简单地e.printStackTrace()
}


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

你是要得到运行时的某个xx对象么?怎么表示这个对象?
Foo@2342342么?照样不知道这个对象是哪个。。。
如果是说变量名,那从stack trace里看对应行的代码,就能看到诸如 a.foo(...),这就知道是a变量存放的对象执行Foo方法

如果要得到详细的stack运行时信息,那得利用jvm的debug接口,这可以用于各个异常,不是专门针对NullPointerException
56 楼 icewubin 2008-11-21  
建议用apache的类判断文本:
StringUtils.isEmpty(str);
StringUtils.isNotEmpty(str);


利用Spring的Assert简化判断:
Assert.notNull(classA);
Assert.notNull(classB, "classB不能为空");
55 楼 amonlei 2008-11-21  
怎么会没有呢?耐心的把异常报告看完,肯定会看到自己程序部分的行号
54 楼 bloodrate 2008-11-21  
在未来的JDK7版本中,增加新特性a..b两个点引用如果a是null则不抛出空指针异常
53 楼 spiritfrog 2008-11-20  
我只觉得如果jvm连NullpointerException都不放过的话, 实在会引起很多开发时候的麻烦。还是就这样好,至少简单。
52 楼 kaka2008 2008-11-20  
datuo 写道
也与编程习惯有关。
比如经常字符串比较值的时侯
object.equals("")
为了避免空指针异常可以写成为:
"".equals(object)


这个。。。
这个还用说?
51 楼 niyanshi 2008-11-20  
jeff.chuh 写道
你这样写的代码会很健壮,我现在也是尽量这么做的,但是大项目中往往控制不了别人怎么写代码。

这个是项目组的best practice.事实上在做类设计的时候,我们把每个方法抛什么Exception也写进去了(Javadoc)。coder必须得按设计写代码,要抛的Exception必须抛出来,不然任务就没完成。
50 楼 datuo 2008-11-20  
也与编程习惯有关。
比如经常字符串比较值的时侯
object.equals("")
为了避免空指针异常可以写成为:
"".equals(object)
49 楼 rianychan 2008-11-20  
刚开始的时候遇到这种问题挺郁闷的
48 楼 jeff.chuh 2008-11-20  
抛出异常的爱 写道
jeff.chuh 写道
由于程序的不严密而出现NullPointerException异常的代码太常见了,
虽然可以在使用对象前检查是否为空,但过多的这种检查会使代码臃肿。
出现这样的异常的时候常常没有明确的信息,给调试带来不便,
即使知道抛出异常的代码行号,但或许因为你手头没有代码,或许因为这行代码有多次方法调用,
而很难得到错误的原因或是判断究竟什么对象是空。

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

log4j.properte
info=debug
日志全开
再把你看着没问题的模块日志关闭
对于
obj.getaaa()
    .getbbbb()
      .getcccc();

用以上写法....


的确是一种方法,可以作为编码规范的一部分。
47 楼 jeff.chuh 2008-11-20  
harryzyp 写道
dennis_zane 写道
对象是null,没有带类型信息,jvm恐怕也没办法给出是什么对象。
在很多需要判断null地方,最好还是采用Null Object模式


Null Object模式是身???


google一下就有了,好像就是用不做任何事的对象代替null
46 楼 xiaojiit 2008-11-20  
自己感觉,还是这样的好,在JVM上加上信息话,虚拟机会又会慢很多,为了报错,每个调用都要检查,保存,会更慢的。
http://www.sharejava.cn/
45 楼 抛出异常的爱 2008-11-20  
jeff.chuh 写道
由于程序的不严密而出现NullPointerException异常的代码太常见了,
虽然可以在使用对象前检查是否为空,但过多的这种检查会使代码臃肿。
出现这样的异常的时候常常没有明确的信息,给调试带来不便,
即使知道抛出异常的代码行号,但或许因为你手头没有代码,或许因为这行代码有多次方法调用,
而很难得到错误的原因或是判断究竟什么对象是空。

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

log4j.properte
info=debug
日志全开
再把你看着没问题的模块日志关闭
对于
obj.getaaa()
    .getbbbb()
      .getcccc();

用以上写法....

相关推荐

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    深入JVM内核—原理、诊断与优化

    《深入JVM内核—原理、诊断与优化》是一份深度探索Java虚拟机(JVM)的视频教程,旨在帮助开发者全面理解JVM的工作机制,掌握性能诊断技巧,并能进行有效的优化。本教程覆盖了从基础到高级的JVM主题,不仅适用于Java...

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。...通过结合理论知识与实际源码阅读,可以更好地掌握Java编程的精髓,提高解决复杂问题的能力。

    Linux简单调优与JVM参数.docx

    Linux 服务器调优与 JVM 参数调优 本文主要介绍了 Linux 服务器调优和 JVM 参数调优的相关知识点,以便提高服务器性能和 JVM 应用程序的运行效率。 Linux 服务器调优 Linux 服务器调优是指对 Linux 操作系统的...

    揭秘Java虚拟机-JVM设计原理与实现

    《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    本教程——“深入JVM内核—原理、诊断与优化视频教程”,将重点讲解这些关键点,帮助开发者提升技术水平,更好地解决实际问题。 首先,我们来探讨JVM的内核原理。JVM主要由类加载子系统、运行时数据区、执行引擎、...

    (46页完整版)JVM体系结构与GC调优.zip

    46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT...

    JVM与GC调优课程视频

    JVM与GC调优课程视频 〖课程介绍〗: JVM与GC调优课程视频 〖课程目录〗: 1.笔记/ ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时...

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    【JVM运行机制详解】 Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行...在《深入JVM内核—原理、诊断与优化》视频教程中,会详细讲解这些内容,并结合实际案例进行演示和实践,帮助开发者成为JVM领域的专家。

    jvm 详细介绍,了解jvm各个组成部分和功能

    ### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心在于源文件的编译与执行。不同于 C/C++ 这类需要针对不同平台进行编译的语言,Java 采用了一种更为灵活的...

    JVM详解与学习

    ### JVM详解与学习 #### Java相关 ##### 1.1 Java定义 Java 是一种广泛使用的高级编程语言,具有面向对象、跨平台等特性。它的设计理念是“一次编写,到处运行”,这得益于Java虚拟机(JVM)的存在。JVM使得Java...

    jvm 启动过程 JVM 原理

    - **本地方法栈**:与Java方法不同,本地方法栈为JNI(Java Native Interface)调用的C/C++等本地方法服务。 了解JVM的启动过程和工作原理对于优化Java程序性能至关重要。通过调整JVM参数,我们可以控制堆大小、...

    gp-jvm-visualvm

    《深入探索Java虚拟机:以gp-jvm-visualvm为例》 Java虚拟机(JVM)是Java程序运行的核心,它负责解析字节码、管理内存、执行线程以及优化代码。当我们谈论“gp-jvm-visualvm”时,我们是在讨论一个用于深入理解和...

    jvm特性与java特性

    Android最初使用Dalvik虚拟机来执行Android应用程序,虽然Dalvik与传统的JVM在设计上有所不同,但随着Android的发展,现在主流Android应用也是基于Java或Kotlin开发,并且在Android Runtime (ART)下运行,ART替代了...

    JVM规范与深入理解

    《JVM规范与深入理解》这个主题涵盖了Java虚拟机(Java Virtual Machine)的全面解析,旨在帮助开发者深入了解JVM的工作原理及其对程序性能的影响。在这个主题中,我们主要关注两个核心资源:周志明的《深入理解Java...

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

    狂神说JVM探究.rar

    - 本地方法栈:与JVM栈类似,但服务于Java Native Interface(JNI)调用的本地方法。 - 堆内存:存放对象实例,进行垃圾回收的主要区域。 - 方法区(非堆):存储已加载的类信息、常量、静态变量等。 - 运行时...

    SAP JVM 8.1 64 bits

    SAP JVM旨在提高性能、可靠性和安全性,同时确保与SAP产品的无缝集成。以下是对这个版本的一些关键知识点的详细解释: 1. **64位架构**:SAP JVM 8.1是针对64位操作系统设计的,这意味着它可以利用更多的内存资源,...

    JVM中文指令手册.pdf

    6. 参数与执行:一部分JVM指令需要一个参数来指示需要执行的操作,例如push指令。参数通常紧跟在指令码之后,明确指出指令要操作的具体内容。 7. 缺失信息的处理:文档提到了由于OCR扫描导致的识别错误或者漏识别...

Global site tag (gtag.js) - Google Analytics