Как прервать выполнение программы 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 шт):

Автор решения: Aziz Umarov

Не нужно изобретать велосипед ("украдите его").

Посмотрите любой приличный фреймворк на Application.Run, .... в Application.Run у вас будет отлов исключения try catch и выход из основного приложения. Иначе говоря если исключение пробросилось catch(e){ throw e} до Application.Run то вывод/логирование/... и выход из Application.Run.

→ Ссылка
Автор решения: Sergei Kirjanov

Можно просто нигде не ловить исключения. Всё будет работать, но вывод в консоль будет не красивый.

Можно вместо println бросать дальше свои исключения:

} catch (FileNotFoundException e) {
  throw new MyPrettyException("Файл не был найден, проверьте путь");

А в самом конце main-a ловить:

} catch (MyPrettyException e){
   System.err.println("Вы забыли прописать путь к файлу");
   System.exit(1)
}

System.err и (1) нужны, чтобы в случае вызова этой программы из другой программы можно было легко определить, что что-то пошло не так.

→ Ссылка
Автор решения: Blacit

Мне дал этот ответ 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("Вы забыли прописать путь к файлу");
        }
    }
→ Ссылка