【问题标题】:Java: Exception itself is nullJava:异常本身为空
【发布时间】:2011-12-06 13:32:28
【问题描述】:

我很困惑。是安卓的问题还是Java本身的问题?

当我调试一个与蓝牙一起工作的 Android 应用程序时,流程停止在 IOException 的 catch 块上,后来我发现异常 e 为 null....来自 InputStream。

是的,它不是 NullPointerException,而是其他类型的 null 异常 - 最好说抛出未初始化。

有可能吗?在什么情况下会抛出这样的单元化异常?

【问题讨论】:

  • 请。添加代码示例抛出异常。
  • 这只是与已连接设备的 BluetoothInputStream.read() 调用......但如果有人感兴趣,我会尝试将快照作为证据......
  • @Dimme 作为 IOException???或者我在 IOException 捕获块上捕获这个空抛出,因为它是先写的????有没有可能???
  • 我曾见过调试器被过时的代码愚弄。尝试清理项目,然后再试一次?

标签: java android null bluetooth ioexception


【解决方案1】:

有可能吗?在什么情况下可以抛出这样的单元化异常??

使用符合标准的 Java 编译器和符合标准的 Java 虚拟机,以及通过扩展符合标准的 Dalvik 虚拟机,这是不可能的。 JLS 不允许 e 变量在该位置为 null

您的虚拟机或调试器存在问题,或者您的 IDE、构建工具和/或流程存在问题。

如果我遇到您的情况,我会停止现在使用调试器,然后转而将老式跟踪打印添加到您的代码中。并确保从源代码进行干净且完整的构建。


您应该考虑的另一种可能性是,JRE 在运行时报告的行号(以及调试器所依赖的)与源代码中的行号不一致。如果您在构建和部署过程中犯了错误,则可能会发生这种情况。错误可能类似于忘记保存文件、忘记构建、忘记部署新版本的应用程序或让您的 IDE 与文件系统不同步。


对于它的价值,理论是这是由throw null; 或类似的东西不成立造成的。 JLS section 14.18 说:

“如果表达式的评估正常完成,产生一个空值,则创建并抛出类 NullPointerException 的实例 V' 而不是空值。”

如果您在上下文中阅读该句子会更容易理解,但它清楚地表明throw null; 实际上抛出了NullPointerException


更新

我在堆栈溢出问题中找到了另一个合理的解释:Exception is always NULL

基本上,这是说模拟代码引发了 Eclipse 不知道的异常,而 Eclipse 模拟器正在“有用地”替换 null。这听起来像是一个模拟器错误。

【讨论】:

    【解决方案2】:

    你可能被你的调试器愚弄了。

    在该行下添加另一行代码(像if(false) log.v("",""); 这样无用的代码),在那里中断,然后从那里检查异常的值。

    也可以试试Log.e(TAG, "my null exception", e);,并阅读日志。

    【讨论】:

    • 日志应该打印一些关于该 throwable 的内容,但该 throwable 可能是 null ......它只打印“我的 null 异常”
    • “被你的调试器愚弄”并不一定局限于虚假陈述——调试器可能会破坏程序流或状态,而不仅仅是误报。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多