#java
#java
Вопрос:
У меня есть 2d-массив someArray
с некоторыми системными командами. Допустим, у меня есть эти команды —
ls
lol
(недопустимая команда)pwd
вторая команда вызовет IOException
, а третья команда не будет выполнена. Как мне убедиться, что последняя команда будет выполнена независимо от какого-либо исключения? Любой совет?
for ( int i = 0; i < someArray.length; i ) {
try{
ProcessBuilder pb = new ProcessBuilder(someArray[index]);
pb.redirectErrorStream(true);
Process process = pb.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ( (line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}catch(IOException e){
System.err.println( "Command not found" );
}
}
Комментарии:
1. Используйте
finally
после блока catch.2. пожалуйста, покажите полный код, включая ваш цикл, хотя команды
3. @ChristopherSchneider как мне начать со следующего индекса?
Ответ №1:
Вместо использования IOException в catch используйте исключение общего класса, которое будет перехватывать любые возникающие исключения
for ( int i = 0; i < someArray.length; i ) {
try{
ProcessBuilder pb = new ProcessBuilder(someArray[i]);
pb.redirectErrorStream(true);
Process process = pb.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ( (line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
System.err.println( "Command not found" );
} catch (Exception e) {
System.err.println("Unexpected Exception caught to continue other commands");
e.printStackTrace();
}
}
редактировать: исправлено сообщение о непредвиденной ошибке
Комментарии:
1. Перехват
Exception
— плохая практика. Особенно когда вы не уверены, что сообщаете все подробности об исключении. Существует большой риск того, что какое-то неизвестное исключение, которое не должно быть перехвачено здесь, будет перехвачено и замаскировано, чтобы вы не узнали, что пошло не так.2. Я согласен, но вопрос был явно сформулирован: «Как мне убедиться, что последняя команда будет выполнена независимо от какого-либо исключения». Для меня было достаточно поймать исключение IOException, поскольку это было бы единственное известное исключение, вызванное, когда команда была ошибочной
3. Уважая комментарий о плохой практике.. Если пользователь может передавать что угодно, гарантировано ли, что
Process
всегда будет / может выдаватьIOException
? Что, если у нее есть другое исключение, блокирующее ее продолжение? Просто очищаю..4. Если
IOException
это единственное проверенное исключение, которое у вас может быть, вы всегда можете рисковать непроверенным исключением. Такое может быть перехвачено с помощьюRuntimeException
при желании (так что вам все равно не нужноcatch (Exception e)
).