我感到相当困惑。这是一个Android问题还是Java本身的问题?
当我调试与蓝牙配对的Android应用程序时,流程停在了一个IOException
的catch块中,之后我发现异常e是null...当我尝试从InputStream读取数据时抛出该异常。
是的,这不是NullPointerException
,而是某种其他类型的异常, 它是 null - 更好地说是未初始化抛出的异常。
这是否可能?在哪种情况下会抛出这样未初始化的异常呢?
我感到相当困惑。这是一个Android问题还是Java本身的问题?
当我调试与蓝牙配对的Android应用程序时,流程停在了一个IOException
的catch块中,之后我发现异常e是null...当我尝试从InputStream读取数据时抛出该异常。
是的,这不是NullPointerException
,而是某种其他类型的异常, 它是 null - 更好地说是未初始化抛出的异常。
这是否可能?在哪种情况下会抛出这样未初始化的异常呢?
e
变量为null
。要么你的虚拟机有缺陷,要么是调试器有问题,或者是IDE、构建工具和/或过程出了问题。如果我处在你的情况下,我会暂停使用调试器,并回归到向代码添加老式的跟踪打印语句。并确保从源代码进行干净和完整的构建。
你需要考虑的另一个可能性是,JRE在运行时报告的行号(调试器所依赖的)与源代码中的行号不匹配。如果您在构建和部署过程中出现错误,就会出现这种情况。错误可能是忘记保存文件、忘记构建、忘记部署新版本的应用程序或使IDE与文件系统不同步。
就算价值不大,但理论认为这是由于throw null;
或等效的东西不起作用。JLS section 14.18说:
"如果表达式的求值正常完成并产生空值,则会创建一个类NullPointerException的实例V',而不是null,并将其抛出。"
如果您在上下文中阅读该句子,那么更容易理解,但它清楚地表示throw null;
实际上会抛出NullPointerException
。
更新
我在这个Stack Overflow问题中找到了另一个合理的解释:异常始终为空
基本上,它是说模拟代码抛出了一个Eclipse不知道的异常,而Eclipse模拟器“贴心地”替换成了null
。这听起来像是模拟器的bug。
你可能被调试器欺骗了。
在那行代码下面再加一行代码(可以是无用的代码,比如if(false) log.v("","");
),在那里打断点,检查异常的值。
还可以尝试使用Log.e(TAG, "my null exception", e);
,并阅读日志。