【问题标题】:Why is this exception null? [closed]为什么这个异常为空? [关闭]
【发布时间】:2014-04-23 09:49:27
【问题描述】:

显然,这是一个简化的示例,但它说明了我的观点。我正在使用第 3 方 SDK 并遇到这种情况,我可以使用以下代码重现它。

try {
    java.util.List<java.lang.String> nullList;
    nullList = null;

    for(java.lang.String s : nullList){}
}
catch(Exception e){
        e.printStackTrace();
}

这段代码将抛出一个被捕获的异常,但e 始终为空。这是为什么?

更新
我将代码复制到一个新方法,e 不再为空。当我使用 IntelliJ 时,我将跟进 JetBrains。也许这是他们的问题。

【问题讨论】:

  • 您的意思是eNullPointerException
  • 空指针异常应该/将在 foreach 循环中被抛出。
  • 我们需要更多细节。
  • 把它放到你的IDE中。 Exception 对象,e 为空。没有比提供更多的细节了。
  • 发布堆栈跟踪和行号。如果enulle.printStackTrace() 将抛出自己的NullPointerException

标签: java android exception try-catch


【解决方案1】:

如果你指的是在 catch 块中捕获的异常,它不可能为 null,但它的 message 可以为 null。

【讨论】:

  • 我也有同样的想法,这就是我要问的原因。我不会问e 是否不为空。
  • catch 块中不能为空。你如何确定它是空的?在哪里?
  • 在调试模式下,我将鼠标悬停在ee=null 上。我打开表达式求值器并输入e 并得到result=null。在调试器变量窗口e=nullSystem.out.println(e==null) 打印 true。我现在正在调查 IDE 问题。我移动了代码,现在我得到了预期的 NPE。
【解决方案2】:

它实际上不为空,在运行代码时它确实给了我以下堆栈跟踪

java.lang.NullPointerException
    at Trialstuff.main(Trialstuff.java:7)

【讨论】:

  • Trialstuff 是类名,所以忽略它
  • 真的,它实际上是一个 NullPointerException 被抛出。但即便如此,为什么e 为空?即使我抓住了更具体的NullPointerException,情况仍然如此。
  • 这是因为 NullPointerException 没有被抛出。你在你的 catch 语句中捕捉到了它。如果您删除 e.printStackTrace();从 catch 块中,代码将运行而不输出任何有关错误的信息。
【解决方案3】:

e 不为空,将 e.printStackTrace() 替换为:

System.out.println(e==null);

这会告诉你不为空,会打印 false

e 是 java.lang.NullPointerException,不要与 null 混淆

【讨论】:

  • 这显示System.out﹕ true
  • 不,那不可能。复制代码,将其粘贴到 main 方法中并运行它。
【解决方案4】:

您的 for 似乎发生异常的循环相当于

List list = nullList;
for (Iterator iterator = nullList.iterator(); iterator.hasNext();) {
    s = (String)iterator.next();
}

所以在尝试访问 nullList 变量的 iterator 方法时应该抛出 NPE 而不是 null

这个Ideone demo 表明eNullPointerException

【讨论】:

  • 不。 e=null。我不是 java 大佬,所以我不知道这是否可能发生。我觉得很奇怪。
猜你喜欢
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2013-05-08
相关资源
最近更新 更多