Java 程序在捕捉块结束之前继续
我很难理解这一点Java 程序在捕捉块结束之前继续,java,try-catch,Java,Try Catch,我很难理解这一点 public static void main(String[] args){ int nulberOfTests = 10; for( int i=0 ; i < numberOfTest ; i++){ try{ File file = getRandomFile(directory); foo(file); }catch(IOException){
public static void main(String[] args){
int nulberOfTests = 10;
for( int i=0 ; i < numberOfTest ; i++){
try{
File file = getRandomFile(directory);
foo(file);
}catch(IOException){
System.out.println("Failed to split the file: " + file.getName());
}
}
}
foo(File file) throws IOException{
System.out.println("Starting foo with " +file.getName());
List<String> blockFiles = split(file); //this throws IOException.
for(int i =0 ; i< blockFiles.size(); i++){
try{
bar(blockFiles.get(i)); //this throws some exceptions
}catch (Exception e){
System.err.println("Failed bar on " + blockFiles.get(i));
e.printStackTrace();
//Handle the exception
}finally{
//clean up
}
}
//continue with the function
}
因此,printStackTrace在下一个foo启动之后发生。我不明白这一点。在返回主循环并启动另一个foo之前,它应该继续使用bar函数的循环和foo的其余部分
有人能解释我这种奇怪的行为吗?也许告诉我该做些什么改变,以便在下一个foo开始之前,捕获中的所有内容都能运行
PS:我知道这不是“最小完整性和可验证性”,但这里面有太多的东西使其完整性和可验证性,这真的很难理解。我希望这里的内容足够了。您的问题很难理解,代码显然不是真实的,但我想您是在问为什么消息会以意外的顺序显示 一个可能的答案是:
System.out.println("Failed to split the file: " + file.getName());
System.out.println("Starting foo with " +file.getName());
System.err.println("Failed bar on " + blockFiles.get(i));
e.printStackTrace();
您是否注意到其中一些打印到System.out
,另一些打印到System.err
这是两条截然不同的河流。即使它们被重定向到同一个位置,在Java中,这两个流也被分别缓冲,并且具有不同的“自动刷新”特性。这意味着输出可能以意外的方式散布。例如:
public static void (String[] args) {
System.out.println("Hi");
System.err.println("Mom");
}
可能输出:
Hi
Mom
或
如果您需要错误消息或堆栈跟踪按代码写入的顺序显示,只需使用一个消息流即可。接受的答案不正确或至少不明确 如果将System.err替换为System.out,则两个println的顺序将相同:错误,然后是新文件的开头 出现问题的是堆栈跟踪 原因是一样的。方法java.lang.Throwable.printStackTrace()写入System.err 如果希望获得预期的顺序,请在同一流中打印堆栈跟踪和消息 要在System.out上打印堆栈跟踪,请使用:
e.printStackTrace(System.out);
该程序可能按正确的顺序运行。您看到的行为必须仅与system.out缓冲区的刷新相关联。看看这个:我看不出有什么明显的问题。你能试着调试你的代码,看看到底是什么引发了这个异常吗?或者,可以包含堆栈跟踪吗?另外,
split()
方法在这里做什么?我知道是什么引发了异常,但这不是我的问题。即使抛出异常,我也必须确保程序继续运行。这就是为什么在进一步使用另一个foo函数之前,我需要catch完成他的所有工作。我会在我的帖子上刊登详细信息,也许不会。我想@ernest_k和Stephen是对的:这是一个更进一步的捕获,但没有按正确的顺序打印。哦,好的。我原以为程序是以意外的顺序运行的(在完成捕获之前启动新的foo),但是这个解释更有意义。谢谢!
Mom
Hi
e.printStackTrace(System.out);