Java:异常本身为null

Pra*_*ham 26 java null android bluetooth ioexception

我很困惑它自己的android问题或Java问题.

当我调试一个与蓝牙一起工作的android应用程序时,流程停在了一个catch块上IOException,后来我发现异常e为null ....当我试图从InputStream读取时抛出它

是的,它不是一个NullPointerException但是其他类型的异常是空的 - 更好的说抛出未初始化.

可能吗?在哪种情况下可以抛出这种单元化异常?

一个例外是null ....它不是一个空指针异常

Ste*_*n C 17

可能吗?在哪种情况下可以抛出这种单元化异常?

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

要么你有一个有缺陷的虚拟机,一个有缺陷的调试器,或者你的IDE,构建工具和/或进程有问题.

如果我遇到你的情况,我现在就停止使用调试器,然后再向你的代码添加老式的跟踪图.并确保您从源代码执行干净且完整的构建.


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


FWIW,理论上认为这是由throw null;相当于或不等的水引起的.该JLS节14.18说:

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

如果你在其上下文中阅读该句子,则更容易理解,但它清楚地说明throw null;实际上会抛出一个句子NullPointerException.


UPDATE

我在这个SO问题中找到了另一个似是而非的解释:Exception总是为NULL

基本上,它表示模拟代码抛出Eclipse不知道的异常,并且Eclipse模拟器"有帮助"替换a null.这听起来像是一个模拟器错误.


tac*_*one 0

您可能被调试器愚弄了。

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

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