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);