Java:异常本身为null

时间:2011-12-06 13:32:28

标签: java android null bluetooth ioexception

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

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

是的,它不是NullPointerException,而是其他类型的异常,无效 - 更好的说抛出未初始化。

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

An exception is null.... ITS NOT A NULL POINTER EXCEPTION

4 个答案:

答案 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中读取时发生,请查看此链接...

Android Bluetooth connection issue

答案 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)