程序结束前出现的异常详细信息



我有一个for循环:

for(Location l : locs) {
    System.out.println("X:"+l.getX()+", Y:"+l.getY());
    try {
        if(layer.getObject(l) != null) 
            out.add(layer.getObject(l));
    } catch(NullPointerException e) {
    }
}

每次迭代,它都会从Location[]数组中获取一个Location,并打印出该位置的X和Y。然后,下一行从地图层(而不是标准地图库)中的位置获取对象,并将其添加到ArrayList中。

我要考java.lang.ClassCastException,但这不是我的问题。这个问题我可以自己解决。我的问题是为什么输出显示为这样(特别是异常的显示方式):

run:
X:0, Y:1
X:0, Y:2
X:0, Y:3
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LMapGrid.OverlayObject;
X:1, Y:1
X:1, Y:3
X:2, Y:1
X:2, Y:2
X:2, Y:3
    at MapGrid.MapGrid.getAdjacentOfType(MapGrid.java:86)
    at BehaviorMap.BehaviorMap.main(BehaviorMap.java:26)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

它所查找的对象位于位置(1,1),因此,在位置(1,1。这是从程序开始设置的。程序正在主线程上运行。然而,我的问题是,为什么输出会以这种方式出现?

这种布局方式似乎意味着,当程序达到(0,3)时抛出了异常,但当它达到(1,1)时一定抛出了异常。然后,输出将意味着,一旦发现异常,程序将继续执行,直到循环退出。

我不理解这种行为。当遇到未处理的异常时,为什么程序不简单地退出?此外,为什么Exception消息出现在调用Exception的行之前?注意,System.out.println位于try块之前。

最后,为什么错误会以如此奇怪的方式分裂?(在出现错误消息后,程序出现继续执行的详细信息。)平台是NetBeans 7.2。

这种布局方式似乎意味着,当程序达到(0,3)时抛出了异常,但当它达到(1,1)时一定抛出了异常。然后,输出将意味着,一旦发现异常,程序将继续执行,直到循环退出。

未捕获异常的默认行为是将它们打印到标准错误流(System.err)中。这可以按照与标准输出流(System.out)不同的顺序显示在控制台上。

我不理解这种行为。当遇到未处理的异常时,为什么程序不简单地退出?此外,为什么Exception消息出现在调用Exception的行之前?请注意,System.out.println位于try块之前。

这取决于MapGrid.MapGrid.getAdjacentOfType在做什么。看起来它正在捕获异常并调用Exception.printStackTrace(),后者打印为标准错误。

最后,为什么错误会以如此奇怪的方式分裂?如果出现错误消息,则在程序出现以继续执行之后会显示详细信息。平台是NetBeans 7.2。

同样,因为输出流和错误流不一定按写入顺序(相对于彼此)显示在控制台上。

相关内容

  • 没有找到相关文章

最新更新