我有一个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。
答案 0 :(得分:3)
这个布局的方式似乎意味着当程序达到(0,3)时抛出异常,但是当达到(1,1)时必须抛出异常。然后,输出意味着,一旦发现异常,程序就会继续执行,直到循环退出。
未捕获的异常的默认行为是将它们打印到标准错误流(System.err
)。这可以在控制台上以与标准输出流(System.out
)不同的顺序显示。
我不明白这种行为。遇到未处理的异常时,为什么程序不退出?另外,为什么Exception消息出现在调用Exception的行之前?请注意,System.out.println位于try块之前。
这取决于MapGrid.MapGrid.getAdjacentOfType
正在做什么。看起来它正在捕获异常并调用Exception.printStackTrace()
,它会打印到标准错误。
最后,为什么错误会以如此奇怪的方式分裂?由于出现错误消息,因此在程序显示继续执行后会显示详细信息。平台是NetBeans 7.2。
同样,因为输出和错误流不一定按照它们写入的相同顺序显示在控制台上(相对于彼此)。