Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can Java';s NullPointerException是否更改为报告哪个变量为null?_Java_Nullpointerexception - Fatal编程技术网

Can Java';s NullPointerException是否更改为报告哪个变量为null?

Can Java';s NullPointerException是否更改为报告哪个变量为null?,java,nullpointerexception,Java,Nullpointerexception,Java中的NullPointerException似乎只报告它发生在特定的代码行上。如果一行代码中使用了多个变量,是否可以将该异常更改为说明哪个变量为null?否。NullPointerException不一定总是由变量/标识符为null引起的。例如,抛出新的NullPointerException()和抛出null。尽管经常如此,但这并不是严格要求的 在大多数情况下,导致NPE的原因相当明显。如果不是,那么您可能在一行代码中进行了太多的操作 考虑这个用例: foo.doWork(bar1,

Java中的
NullPointerException
似乎只报告它发生在特定的代码行上。如果一行代码中使用了多个变量,是否可以将该异常更改为说明哪个变量为null?

否。NullPointerException不一定总是由变量/标识符为
null
引起的。例如,
抛出新的NullPointerException()
抛出null
。尽管经常如此,但这并不是严格要求的

在大多数情况下,导致NPE的原因相当明显。如果不是,那么您可能在一行代码中进行了太多的操作

考虑这个用例:

foo.doWork(bar1, bar2, bar3);
这里很明显,
foo
是空的

另一种情况:

foo.doWork(bar.get(), bar2.get())
这里可以是
foo
bar
,或者
bar2


关键是,有了这些信息和断点,应该很明显什么是
null
。如果情况变得更糟,像
FindBugs
这样的静态代码分析器也会给您一些提示。

否,类文件中的调试信息没有包含足够的信息来允许此操作

然而,你可以改善这种情况。有两种情况会导致NPE被抛出:

  • 取消引用变量的
    ,如
    foo.bar()
  • 一个
    [
    索引数组,如
    args[0]

如果你编写的代码在给定的代码行上只有一个,那么毫无疑问是哪一个导致了NPE。它会引入很多临时变量,但在调试时你可以随时获得更多的信息。

遗憾的是,不,这会很有用,尽管代码行不够吗?@Lirik我认为显而易见答案是肯定的。当涉及到意大利面代码时,答案恐怕是否定的……为什么不将调试器指向那一行代码,并确定哪个变量为null。您的代码是否结构不正确,以至于在一行中有两个变量?@pankar问题确实来自链式方法调用。如果我有
something.getThis().getThat().getAnotherThing().WhyAsistillChaining().seriouslyWtf()
全部放在一行上,然后得到一个NPE,唯一简单的方法是将它全部分离,然后重新编译/重新运行。这就是为什么我希望他们把它放在Java 7中。哦,好吧。我最近也遇到了这个问题--NPE是由什么引起的?呃,迭代这些案例会很粗糙。但它可以作为保护模式的一部分抛出。基本上,是一个met检查其参数是否为
null
,然后在工作之前抛出NPE的hod。例如,某些集合这样做是为了避免损坏数据结构。其他应用程序可能只是为了避免NPE的有机发生。随机的糟糕的编码者可能会抛出NPE来取乐。@DaveNewton您也可以从自动装箱中获得NPE,su例如,执行
Integer val=null
并将其传递给
someMethod(int i)
如下:
someMethod(val)所以,所有这些都是由变量引起的,除非是显式抛出的。自动取消装箱也是空指针的一个可能原因。我没有想到这一点。关于自动装箱/取消装箱,我一直持反对意见,但我想我可能会站在一边说“尽可能少施魔法”。换句话说,找出如何将编译器标记autoboxing usages作为错误,并显式地手动进行转换。我相信Eclipse编译器可以做到这一点,但尚未进行检查。事实上,有足够的信息来解决这一问题。您可以找出触发此NPE的指令。在vokevirtual
指令,只需要一个操作数。然后您可以跟踪调用它的对象—只需执行一点点操作work@OneTwoThree有意思。你有更详细的描述的链接吗?