Java:查找NullPointerException
有没有办法找出NullPointerException的来源 当然,编译器会告诉我它出现的那一行,但我不知道出了什么问题。Java:查找NullPointerException,java,exception,Java,Exception,有没有办法找出NullPointerException的来源 当然,编译器会告诉我它出现的那一行,但我不知道出了什么问题。 我希望将来能自己发现这一点 在这种情况下,我正在调用sorter.setNumbers(sortArray)其中分拣机是接口分拣机的一个实例,我在计数排序中有方法设置编号(int[]number){},它实现了分拣机 编译器错误的前几行如下 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerExcepti
我希望将来能自己发现这一点 在这种情况下,我正在调用
sorter.setNumbers(sortArray)代码>其中分拣机
是接口分拣机
的一个实例,我在计数排序
中有方法设置编号(int[]number){}
,它实现了分拣机
编译器错误的前几行如下
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MyCanvas.setSortArray(MyCanvas.java:81)
at SearchComparator$1.actionPerformed(SearchComparator.java:108)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
您的sorter
变量可能为空,要么未设置,要么某行将其覆盖为空。如果有
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MyCanvas.setSortArray(MyCanvas.java:81)
那条线是
sorter.setNumbers(sortArray);
然后,sorter
必须为null
。这是该行中唯一一个调用对象上可以为null的方法的地方。将null
向下传递到setNumbers
无法在此行生成NullPointerException
如果sortArray
为空,并且导致setNumbers
中出现此异常,您将在堆栈跟踪中看到它发生在那里
有两个原因可以使您获得NullPointerException
- 您可以明确地抛出它。例如,您确实
抛出新的NullPointerException()
(甚至抛出null
,这实际上会导致NullPointerException
并因此抛出一个)
- 您尝试对
对象执行某些操作,尽管它是空的
第二种情况下的“做点什么”可以是
- 调用实例方法-要查找的模式是
canThisBeNull.something(
- 在这里访问字段模式只是
canThisBeNull.foo
- 访问
null
数组的length
属性-canthisaraybenull.length
- 访问
null
数组的内容-canthisararybenull[X]
请注意“实例方法”-如果方法是静态的
,则不会出现错误,因为您实际上没有通过对象访问该方法
你也可能有一些棘手的案例,例如,考虑:
int value = this.getValue();
此
不能为null
且原语不能抛出。那么怎么会出现null点异常
?解决方案是自动(取消)装箱:
编译器将自动将您的行转换为
int value = getValue().intValue();
要将可为null
的整数
转换为int
。调用null.intValue()
将导致该异常
因此,要查找NullPointerException
,请查看NullPointerException
堆栈跟踪中最上面的一行(向下搜索由
子句引起的所有,直到您位于底部)
在该行中查找点。然后检查点左侧的任何内容是否可以是null
当您调用指向null的方法时,会出现null指针异常,然后出现null指针异常请将您的MyCanvas代码与行号一起发布当然:)这并不难。你有台词。插入println语句或停止该行并使用调试器显示该行使用的所有对象引用。只有当它们都不为空时,你才有值得向别人求助的理由。我知道。我是新手,对工具不太熟悉。我明白了。我不确定异常是在首先调用错误代码时引发的,还是在实际发生的地方引发的。这很有帮助。
int value = getValue().intValue();