我很困惑它自己的问题或Java问题。
当我调试一个与蓝牙一起工作的android应用程序时,流程停在IOException
的catch块上,后来我发现异常e为null ....当我试图将它抛出时从InputStream中读取
是的,它不是NullPointerException
,而是其他类型的异常,无效 - 更好的说抛出未初始化。
有可能吗?在哪种情况下可以抛出这种单元化异常?
答案 0 :(得分:17)
有可能吗?在哪种情况下可以抛出这种单元化异常?
使用符合条件的Java编译器和符合条件的Java虚拟机,以及通过扩展符合的Davlik虚拟机,这是不可能的。 JLS不允许e
变量在该位置null
要么你有一个有缺陷的虚拟机,一个有缺陷的调试器,或者你的IDE,构建工具和/或进程有问题。
如果我遇到你的情况,我现在就停止使用调试器,然后再向你的代码添加老式的跟踪图。并确保从源代码中完成整个构建。
您应该考虑的另一种可能性是JRE在运行时报告的行号(以及调试器所依赖的行号)与源代码中的行号不一致。如果您在构建和部署过程中犯了错误,就可能发生这种情况。错误可能是忘记保存文件,忘记构建,忘记部署新版本的应用程序或让IDE与文件系统不同步。
FWIW,理论认为这是由throw null;
引起的,或者是等同于不存在水的东西。 JLS section 14.18说:
“如果Expression的评估正常完成,产生一个空值,则会创建并抛出NullPointerException类的实例V',而不是null。”
如果您在其上下文中阅读该句子,则更容易理解,但它清楚地表明throw null;
实际上会抛出NullPointerException
。
更新
我在这个问题中找到了另一个似是而非的解释:Exception is NULL always
基本上,它表示模拟代码抛出了Eclipse不知道的异常,并且Eclipse模拟器“有用”地替换了null
。这听起来像是一个模拟器错误。
答案 1 :(得分:0)
您可能被调试器愚弄了。
在该行下添加另一行代码(像if(false) log.v("","");
那样无用的东西),在那里中断并检查异常的值。
同时尝试Log.e(TAG, "my null exception", e);
并阅读日志。
答案 2 :(得分:-1)
我不确定这是否是同样的问题,但我已经回答了类似的问题...... 如果在您尝试从InputStream中读取时发生,请查看此链接...
答案 3 :(得分:-3)
在Java中,您可以通过抛出NullPointerException
来抛出null
。在这种情况下,throwable最终将是NullPointerException
。
public static void main(String[] args)
{
try{
a(null);
}
catch(Exception e)
{
System.out.println(e);
e.printStackTrace();
}
}
public static void a(String[] args)
{
throw null;
}
输出:
java.lang.NullPointerException
java.lang.NullPointerException
at scjp.Scjp.a(Scjp.java:18)
at scjp.Scjp.main(Scjp.java:8)