我有一个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。
同样,因为输出流和错误流不一定按写入顺序(相对于彼此)显示在控制台上。