2015-04-01 73 views
0

我对这个问题感到困惑: 是否有这样一种情况,即以下三行中的第一行可以产生java.lang.NullPointerException?java.lang.NullPointerException遇到意想不到的地方

if (mJobs == null || mJobs.size() == 0) { <-- trace shows exception here 
    return null; 
} 

这个例外情况出现在无根据的Android 4.4.4手机上。 mJobs声明如下:

ArrayList<Job> mJobs; 

任何想法,将不胜感激。

更新:这次崩溃发生了数千次运行的一次。

+3

我们可以看到堆栈跟踪吗? '作业'是你写的课吗? – 2015-04-01 17:47:40

+0

清洁,重建,再次测试。并确保在Job.size()方法内不引发异常。 – 2015-04-01 17:56:51

+1

你应该真的发布堆栈跟踪甚至是Job类。无论如何,您可能希望通过使用mJobs.isEmpty()来使其更清晰。 – bphilipnyc 2015-04-01 18:04:17

回答

1

不,假设您使用的是java.util.ArrayList而不是您自己的实现。

使用isEmpty()而不是size() == 0会更清楚。我还会检查这些代码是如何被调用的,因为在这两种情况下你都返回null

0

编辑说,Java的“短路”评估不应该导致mJobs.size()被评估,你可以试试看看它是否失败。

if (mJobs == null) { 
    return null; 
} 
if (mJobs.size() == 0) { <-- trace shows exception here 
    return null; 
} 
+2

请解释一下,你有什么资料吗?我一直认为mJobs.size()在OR的左边部分为true的情况下永远不会被评估。 – 2015-04-01 17:47:45

+3

由于短路,没有理由分开。 – 2015-04-01 17:49:34

+0

我很确定这个解释是无效的。至少我真的希望它是无效的。 :) – 2015-04-01 18:12:28

0

如果mJobs为null,再有就是扔在mjobs.size)空指针异常(

if (mJobs == null || (mJobs !=null && mJobs.size() == 0)) { 
    return null; 
} 
+0

不是真的,没有。 '||'短路。 *可能在*'size'中,但非空检查是多余的。 – 2015-04-01 17:49:46

+0

对不起,但你的回答是错误的。在mJobs == null的计算结果为true的情况下,mJobs!= null的计算结果为false,如果在左侧未精简,则在右侧也不会精简。 – 2015-04-01 17:51:19

+0

如果mJobs!= null评估为false,则不会执行正确的部分 – Martin 2015-04-01 17:51:49

3

我不认为有你的NullPointerException是来自任何方面的可能性那第一行代码。我敢打赌,你正在运行的代码是从你正在查看的源代码的不同版本编译而来,让你相信这个错误与其实际上不同。我会重新编译你当前的代码,然后运行它新鲜。

+0

或异常是从Job.size()方法中抛出的。 – 2015-04-01 17:55:57

+3

他没有调用Job.size()方法。他正在调用数组列表的大小方法。 mJobs是一个数组列表。由于他已经通过短路||检查了阵列列表是否不为空,因此他可以安全地检查其大小。 – Troy 2015-04-01 18:05:25

+0

当然!我的坏...感谢您的解释。 – 2015-04-01 21:12:50

0

问题是或当然,或意味着它说,所以运行时间正在评估双方或真正的继续前进。短路不会发生在评估中,因此如果您使用三元操作,则可以在短路情况下将它们组合在一起。与拆分它们相同,只是更短。

if (mJobs == null ? true : mJobs.size() == 0) { 
    return null; 
} 
+2

根据规格不符合。如果mJobs为null,则不评估右侧,至少在Java中。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.24 – bphilipnyc 2015-04-01 18:12:52