3

我有一个 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) 时肯定已经抛出异常。然后,输出将暗示,一旦发现异常,程序将继续执行,直到循环退出。

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

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

4

1 回答 1

3

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

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

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

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

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

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

于 2013-02-15T05:48:19.017 回答