У меня проблемы с пониманием;
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
}
По-моему, это так: я запускаю foo; это попробуй подложить файл; если это терпит неудачу, это бросает IOException, и я просто пишу это и продолжаю с другим foo (файлом) (с другим файлом). Это работает, как ожидалось.
Если это работает, то у меня есть список имен blockFiles, и я иду в другой цикл, чтобы запустить бар на каждом blockFiles. Если строка не работает, я обрабатываю исключение, очищаю вещи и продолжаю цикл со следующим блок-файлом.
Однако происходит следующее: он начинает обрабатывать исключение и одновременно запускает другой файл с другим файлом. Я могу иметь такой вывод:
Starting foo with file7
Failed bar on file7.block3
Starting foo with file12
Java.lang.NullPointerException
....
Таким образом, printStackTrace происходит ПОСЛЕ следующего запуска foo. И я этого не понимаю. Он должен просто продолжить цикл функций бара и остальную часть foo, прежде чем вернуться к основному циклу и запустить другой foo.
Может кто-нибудь объяснить мне это странное поведение? А может, подскажете, что изменить, чтобы все в подвохе запустилось до начала следующего foo?
PS: я знаю, что это не «Минимально завершенный и проверяемый», но в нем слишком много всего, чтобы сделать его полным и проверяемым, и это было бы действительно труднее понять. Я надеюсь, что здесь будет достаточно.