Как прервать выполнение программы Java?
Знаю, что можно использовать System.exit(0), но против такого прерывания, это не совсем корректно. Один путь передаю с помощью аргумента, второй вбиваю. Хотелось бы узнать как прервать программу, если одного из путей нет. Был ещё такой вариант:
if (path == null) return;
Но хотелось бы узнать какой вариант был бы более оптимален в моём случае. Потому что ветвления if/else не совсем люблю. Желательно, чтобы это обрабатывалось в catch.
public class Task implements AutoCloseable {
public static void main(String[] args) throws IOException {
String DownloadFile = "C:\\Users\\IdeaProjects\\Task\\src\\main\\resources\\Out.txt";
Map<String, Departament> departments = new HashMap<>();
String path = args.length > 0 ? args[0] : null;
read(path, departments);
transferToDepartment(departments, DownloadFile);
}
public static void read(String path, Map<String, Departament> departments) throws IOException {
assert path != null;
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "CP1251")); br) {
...
}
System.out.println("Читаемый файл закрыт");
} catch (FileNotFoundException e) {
System.out.println("Файл не был найден, проверьте путь");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Исправьте путь к файлу, выходите за массив");
} catch (NullPointerException e) {
System.out.println("Вы забыли прописать путь к файлу");
}
}
public static void transferToDepartment(Map<String, Departament> departments, String downloadFile) {
...
uploadToFile(download, downloadFile);
}
private static void uploadToFile(List download, String path) {
int i = 0;
try (FileWriter writer = new FileWriter(path, false)) {
while (i < download.size()) {
writer.write((String) download.get(i));
writer.write('\n');
i++;
}
System.out.println("Читаемый файл закрыт");
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
@Override
public void close() {
System.out.println("Читаемый файл закрыт");
}
}
Ответы (3 шт):
Не нужно изобретать велосипед ("украдите его").
Посмотрите любой приличный фреймворк на Application.Run, .... в Application.Run у вас будет отлов исключения try catch и выход из основного приложения. Иначе говоря если исключение пробросилось catch(e){ throw e} до Application.Run то вывод/логирование/... и выход из Application.Run.
Можно просто нигде не ловить исключения. Всё будет работать, но вывод в консоль будет не красивый.
Можно вместо println бросать дальше свои исключения:
} catch (FileNotFoundException e) {
throw new MyPrettyException("Файл не был найден, проверьте путь");
А в самом конце main-a ловить:
} catch (MyPrettyException e){
System.err.println("Вы забыли прописать путь к файлу");
System.exit(1)
}
System.err и (1) нужны, чтобы в случае вызова этой программы из другой программы можно было легко определить, что что-то пошло не так.
Мне дал этот ответ Stranger in the Q, привожу вариант, который использую. Здесь мы пробрасываем исключения из метода read в главный метод main и там обрабатываем.
try {
read(path, departments);
transferToDepartment(departments, DownloadFile);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
public static void read(String path, Map<String, Departament> departments) throws IOException {
assert path != null;
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "CP1251")); br) {
...
}
System.out.println("Читаемый файл закрыт");
} catch (FileNotFoundException e) {
throw new RuntimeException("Файл не был найден, проверьте путь");
} catch (ArrayIndexOutOfBoundsException e) {
throw new RuntimeException("Исправьте путь к файлу, выходите за массив");
} catch (NullPointerException e) {
throw new RuntimeException("Вы забыли прописать путь к файлу");
}
}