Java:异常本身为空
我很困惑。是Android问题还是Java本身的问题?
当我调试一个与蓝牙一起使用的Android应用程序时,流在一个捕获块上停止,我后来发现异常e为空。当我试图从输入流中读取时,它被抛出。IOException
是的,它不是一个,而是一些其他类型的异常,它是空的 - 最好说抛出未初始化。NullPointerException
可能吗?在哪种情况下可以引发此类单元化异常?
我很困惑。是Android问题还是Java本身的问题?
当我调试一个与蓝牙一起使用的Android应用程序时,流在一个捕获块上停止,我后来发现异常e为空。当我试图从输入流中读取时,它被抛出。IOException
是的,它不是一个,而是一些其他类型的异常,它是空的 - 最好说抛出未初始化。NullPointerException
可能吗?在哪种情况下可以引发此类单元化异常?
可能吗?在什么情况下可以引发这种单一化异常?
使用符合标准的 Java 编译器和符合标准的 Java 虚拟机,以及通过扩展符合标准的 Dalvik 虚拟机,这是不可能实现的。JLS 不允许变量位于该位置e
null
要么你有一个错误的虚拟机,一个错误的调试器,要么你的IDE,构建工具和/或进程有问题。
如果我处于您的情况,我现在将停止使用调试器,并回退到将老式的痕迹指纹添加到您的代码中。并确保从源代码进行干净且完整的构建。
您应该考虑的另一种可能性是,JRE 在运行时报告的行号(以及调试器所依赖的行号)与源代码中的行号不对齐。如果在生成和部署过程中犯了错误,则可能会发生这种情况。错误可能是忘记保存文件,忘记构建,忘记部署新版本的应用程序或使IDE与文件系统不同步。
就其价值而言,理论是这是由等效物引起的,或者等效的东西不成立。JLS 第 14.18 节说:throw null;
“如果表达式的计算正常完成并生成空值,则创建并抛出类 NullPointerException 的实例 V',而不是 null。
如果您在上下文中阅读该句子,则更容易理解,但它清楚地表明实际上会抛出一个.throw null;
NullPointerException
更新
我在这个堆栈溢出问题中发现了另一个合理的解释:异常始终为NULL
基本上,它是说模拟代码正在引发一个Eclipse不知道的异常,而Eclipse模拟器正在“有帮助地”替换一个。这听起来像是一个模拟器错误。null
您可能被调试器愚弄了。
在该行下添加另一行代码(无用的代码),在那里中断,然后从那里检查异常的值。if(false) log.v("","");
同时尝试 ,并读取日志。Log.e(TAG, "my null exception", e);