2014-01-16 56 views
-1

有没有办法找出NullPointerException来自哪里?Java:查找NullPointerException异常

编译器告诉我它发生的原因,但我不知道什么是错的。
我希望能够在未来自己发现。

在这种情况下,我呼吁sorter.setNumbers(sortArray);其中sorter是接口Sorter的实例,我在CountingSort方法setNumbers(int [] numbers){}它实现Sorter

的编译器错误的前几行如下

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) 
+1

请发表您的MyCanvas –

+0

代码随着当然:) –

+0

的行号这并不难。你有一条线。可以插入println语句或停止行,并使用调试器显示行使用的所有对象引用。只有当它们都不为零时,你才会有案例值得向其他人求助。 –

回答

2

如果你有

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

  • 你可以明确地抛出它。例如。你做throw new NullPointerException()(甚至throw null这实际上导致NullPointerException,因此抛出一个)
  • 你尝试做一些与Object虽然它是null

“有所作为”在第二种情况下可以

  • 调用一个实例方法 - 要查找的是canThisBeNull.something(
  • 访问领域的模式 - 在这里模式只是canThisBeNull.foo
  • 访问a null array length property - canThisArrayBeNull.length
  • access a null array的内容 -在“实例方法”

注意 - 有没有错误,如果该方法是static,因为你其实并不通过访问对象的方法。

您也可以很难找到案例。例如。考虑:

int value = this.getValue(); 

this不能null和基本不能扔。那么怎么会有一个NullPointerException?解决的办法是自动(UN)拳击:

private Integer getValue() { 
    return null; 
} 

编译器会自动把你的行成

int value = getValue().intValue(); 

Integer可以是nullint转换。拨打null.intValue()将导致该异常。

因此,要找到一个NullPointerException,看最上面的线在NullPointerException的堆栈跟踪(下井所有caused by条款,直到你在底部)

在该行找点。然后检查点左侧的任何东西是否可以是null。当你调用它指向一个空的方法出现

+0

我明白了。我不确定当错误代码被首先调用或实际发生时是否引发异常。这非常有帮助。 – sebastian

2

sorter变量可能是空,要么是未设置或者一些线覆盖它为空。

0

空指针,则空指针异常来