程序结束前出现异常细节?

时间:2013-02-15 05:41:05

标签: java exception netbeans

我有一个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[]数组中获取一个位置,并打印出该位置的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。

1 个答案:

答案 0 :(得分:3)

  

这个布局的方式似乎意味着当程序达到(0,3)时抛出异常,但是当达到(1,1)时必须抛出异常。然后,输出意味着,一旦发现异常,程序就会继续执行,直到循环退出。

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

  

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

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

  

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

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