Java:异常本身为null。

26

我感到相当困惑。这是一个Android问题还是Java本身的问题?

当我调试与蓝牙配对的Android应用程序时,流程停在了一个IOException的catch块中,之后我发现异常e是null...当我尝试从InputStream读取数据时抛出该异常。

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

这是否可能?在哪种情况下会抛出这样未初始化的异常呢?

An exception is null... Note: it's NOT a null pointer exception!!


请添加抛出异常的代码示例。 - Azodious
这只是一个使用已连接设备的BluetoothInputStream.read()调用...但我正在尝试放置一个快照作为证明,如果有人感兴趣的话... - Prasham
我的@Dimme被定义为一个IOException???或者我是因为它是第一个写在IOException catch块中而捕获了这个null throw???这真的可能吗??? - Prasham
4
我之前见过调试器被过期的代码所迷惑。也许尝试清理项目并再试一遍? - Ian McLaird
2个回答

17
这是使用符合Java编译器和虚拟机(包括符合Dalvik虚拟机)不可能发生的情况。JLS不允许在该位置上e变量为null。要么你的虚拟机有缺陷,要么是调试器有问题,或者是IDE、构建工具和/或过程出了问题。如果我处在你的情况下,我会暂停使用调试器,并回归到向代码添加老式的跟踪打印语句。并确保从源代码进行干净和完整的构建。

你需要考虑的另一个可能性是,JRE在运行时报告的行号(调试器所依赖的)与源代码中的行号不匹配。如果您在构建和部署过程中出现错误,就会出现这种情况。错误可能是忘记保存文件、忘记构建、忘记部署新版本的应用程序或使IDE与文件系统不同步。


就算价值不大,但理论认为这是由于throw null;或等效的东西不起作用。JLS section 14.18说:

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

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


更新

我在这个Stack Overflow问题中找到了另一个合理的解释:异常始终为空

基本上,它是说模拟代码抛出了一个Eclipse不知道的异常,而Eclipse模拟器“贴心地”替换成了null。这听起来像是模拟器的bug。


0

你可能被调试器欺骗了。

在那行代码下面再加一行代码(可以是无用的代码,比如if(false) log.v("","");),在那里打断点,检查异常的值。

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


日志应该打印关于可投掷对象的信息,但可能可投掷对象为null... 它只打印"My null exception",没有更多信息。 - Prasham
“被调试器愚弄”不一定局限于误报——调试器可能会潜在地破坏程序流程或状态,而不仅仅是错误地报告它。 - Chris Stratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接