Java:异常本身为空

Java:异常本身为空,java,android,null,bluetooth,ioexception,Java,Android,Null,Bluetooth,Ioexception,我很困惑。这是安卓系统的问题还是Java本身的问题 当我调试一个使用蓝牙的Android应用程序时,流在IOException的catch块上停止,我后来发现异常e为空。。。。它是在我试图从输入流读取时抛出的 是的,它不是一个NullPointerException,而是另一种类型的null异常——最好说是未初始化抛出的 可能吗?在哪种情况下可以抛出这样的单元化异常 在Java中,您可以通过抛出null来抛出NullPointerException。在这种情况下,可丢弃的最终将是NullPoin

我很困惑。这是安卓系统的问题还是Java本身的问题

当我调试一个使用蓝牙的Android应用程序时,流在
IOException
的catch块上停止,我后来发现异常e为空。。。。它是在我试图从输入流读取时抛出的

是的,它不是一个
NullPointerException
,而是另一种类型的null异常——最好说是未初始化抛出的

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


在Java中,您可以通过抛出
null
来抛出
NullPointerException
。在这种情况下,可丢弃的最终将是
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)

你可能被调试器愚弄了

在该行下添加另一行代码(类似于
if(false)log.v(“,”);
),在那里中断,然后从那里检查异常的值

还可以尝试
Log.e(标记“MyNullException”,e),然后读取日志

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

使用一致性Java编译器和一致性Java虚拟机以及扩展一致性虚拟机是不可能的。JLS不允许
e
变量在该位置为
null

要么是虚拟机有问题,要么是调试器有问题,要么是IDE、构建工具和/或流程有问题

如果我是你的情况,我会暂时停止使用调试器,转而向代码中添加老式的TracePrint。并确保从源代码进行干净完整的构建


您应该考虑的另一种可能性是,JRE在运行时报告的行号(以及调试器依赖)没有与源代码中的行号对齐。如果您在构建和部署过程中犯了错误,可能会发生这种情况。错误可能是忘记保存文件、忘记构建、忘记部署应用程序的新版本或使IDE与文件系统不同步


值得一提的是,该理论认为这是由
throw null引起的或类似的东西是站不住脚的。报告说:

如果表达式的求值正常完成,生成空值,则创建并抛出NullPointerException类的实例V',而不是null

如果你在上下文中阅读这个句子会更容易理解,但它清楚地表明,
抛出null
实际抛出一个
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;
}

更新

我在这个问题中找到了另一个似是而非的解释:


基本上,它是说模拟代码抛出了一个Eclipse不知道的异常,而Eclipse仿真器“有益地”替换了一个
null
。这听起来像是一个模拟器错误。

。添加代码示例引发异常。它只是一个BluetoothInputStream.read()调用,已连接设备。。。但如果有人感兴趣的话,我想用一张快照作为证据……@Dimme作为一个例外???或者我在IOException捕获块上捕获这个空抛出,因为它是第一个写入的????有可能吗???我以前见过调试器被过时的代码愚弄。尝试清理项目,然后再试一次?请参阅我发布的屏幕截图。。。。。我想现在你必须在看到答案后改变答案……:)他得到的错误不是nullpointerexception,但异常本身是nullLog,应该打印一些关于该可丢弃的内容,但可能该可丢弃的是null。。。。它只打印“我的null异常”“被调试器愚弄”并不一定局限于误报-调试器可能会损坏程序流或状态,而不仅仅是误报它。