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

可恶的NullPointerException与JVM的失职

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

我觉得这是JVM的失职,它只是抛出了没有任何信息的NullPointerException,
为什么不追加“调用XXX方法时,发现对象不可用”的信息呢
分享到:
评论
24 楼 xieke 2008-11-20  
obj.getAAA().getBBB().getCCC().getDDD().........getZZZ()......get火星java()......
这都完全没有问题啊,都能打印调用栈
很奇怪这帖子还没被置为新手贴
23 楼 cyberblue 2008-11-20  
deco_java 写道
我也觉得如果在每次引用对象的时候都要去判断是否非空,给代码结构和逻辑带来很大麻烦。


当初用perl的时候每个字段都要defined,更麻烦。
22 楼 aws 2008-11-20  
jeff.chuh 写道
引用
还是不太理解你的问题。
NullpointerException
堆栈中肯定包含了对应的对应方法调用信息的啊。。。最后会深入到哪一行的啊。虽然jsp这样的没法调试,但写java代码行标识还是很准确的吧。。


如果那行代码是obj.getAAA().getBBB().getCCC()你就不知道具体是哪个出问题了吧


会抛出异常
我说你到底有没有用过java啊?
21 楼 smilerain 2008-11-20  
听说这个问题本来sun想在1.4解决的,但为了兼容就一直将就了.
我也很烦这个问题.但没办法,除非开源社区能接受修改null的含有.
20 楼 deco_java 2008-11-19  
我也觉得如果在每次引用对象的时候都要去判断是否非空,给代码结构和逻辑带来很大麻烦。
19 楼 wilsonxu 2008-11-19  
就算是getA().getB().getC()的语句,异常栈也可以清晰指出具体抛出异常的方法。
18 楼 baseworld 2008-11-19  
可以参考guice里面对错误信息的处理方式
17 楼 ray_linn 2008-11-19  
design by contrat,这样的工具多了去了。
16 楼 javaeyebird 2008-11-19  
jeff.chuh 写道
由于程序的不严密而出现NullPointerException异常的代码太常见了,
虽然可以在使用对象前检查是否为空,但过多的这种检查会使代码臃肿。
出现这样的异常的时候常常没有明确的信息,给调试带来不便,
即使知道抛出异常的代码行号,但或许因为你手头没有代码,或许因为这行代码有多次方法调用,
而很难得到错误的原因或是判断究竟什么对象是空。

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

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

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


异常堆栈里已经明确指出了。`````不知道LZ是用什么样的格式写error log的
14 楼 hocus 2008-11-19  
jeff.chuh 写道
由于程序的不严密而出现NullPointerException异常的代码太常见了

1 你为啥不提高对自己的要求,让代码严密些呢
2 单元测试就是为此而生的
3 jvm给了你异常处理,还有客制化这些信息的自由
13 楼 gelnyang 2008-11-19  
它不是有exception值栈吗,不就可以看到错在哪儿了?
12 楼 repsihWDX 2008-11-19  
jeff.chuh 写道
引用
还是不太理解你的问题。
NullpointerException
堆栈中肯定包含了对应的对应方法调用信息的啊。。。最后会深入到哪一行的啊。虽然jsp这样的没法调试,但写java代码行标识还是很准确的吧。。


如果那行代码是obj.getAAA().getBBB().getCCC()你就不知道具体是哪个出问题了吧


我个人觉得这是写法问题。。。
11 楼 jeff.chuh 2008-11-19  
引用
还是不太理解你的问题。
NullpointerException
堆栈中肯定包含了对应的对应方法调用信息的啊。。。最后会深入到哪一行的啊。虽然jsp这样的没法调试,但写java代码行标识还是很准确的吧。。


如果那行代码是obj.getAAA().getBBB().getCCC()你就不知道具体是哪个出问题了吧
10 楼 xzs 2008-11-19  
重构与模式-------空指针模式
9 楼 repsihWDX 2008-11-19  
还是不太理解你的问题。
NullpointerException
堆栈中肯定包含了对应的对应方法调用信息的啊。。。最后会深入到哪一行的啊。虽然jsp这样的没法调试,但写java代码行标识还是很准确的吧。。
8 楼 jeff.chuh 2008-11-19  
dennis_zane 写道
对象是null,没有带类型信息,jvm恐怕也没办法给出是什么对象。
在很多需要判断null地方,最好还是采用Null Object模式


对象类型是无法给出了,不过调用的方法名我想应该有办法得到,
多谢提供Null Object模式的信息。
7 楼 dennis_zane 2008-11-19  
对象是null,没有带类型信息,jvm恐怕也没办法给出是什么对象。
在很多需要判断null地方,最好还是采用Null Object模式
6 楼 jeff.chuh 2008-11-19  
我在1楼已经写清楚了,
“但或许因为你手头没有代码,或许因为这行代码有多次方法调用”
那么你将不知道是什么对象为空
5 楼 repsihWDX 2008-11-19  
已然有堆栈冒泡出来了。。你还需要堆栈给你什么信息?
你打印堆栈就能看到清晰的调用树了啊。。

相关推荐

    推荐一些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