Сделайте необработанное исключение в Java сломайте программу - PullRequest
0 голосов
/ 16 апреля 2020

Предположим, у нас есть функция, которая находится глубоко в стеке вызовов. Эта функция выполняет несколько операций и вызывает 5 различных функций, которые выдают исключения.

В C# Я мог бы оставить эти исключения и быть уверенным, что, если какая-либо из них будет сгенерирована, программа прервется. Это то, на что я надеялся здесь - эти исключения должны остановить программу. В Java я получаю ошибки во время компиляции. Насколько я знаю, у меня есть 2 варианта:

  1. Обрабатывать их все и поддерживать работу программы . Но, как я уже сказал, я хочу нарушить работу программы, и обработка всех исключений может привести к путанице в коде.
  2. Заставить функцию перебросить эти исключения . Однако, если бы я сделал это так глубоко в стеке вызовов, мне нужно было бы перебрасывать на каждом другом уровне. Это звучит как очень плохой дизайн.

Чтобы прояснить ситуацию - я не имею в виду, что я хочу игнорировать каждое исключение. Многие из них зарегистрированы & et 1024 *. но возможность просто оставить исключение и быть уверенным в получении подробной ошибки при разрыве программы очень удобна в C#.

Что я могу сделать с этим в Java?

1 Ответ

1 голос
/ 16 апреля 2020

В Java вы должны обрабатывать отмеченные исключения, поэтому вы видите ошибки. Это обеспечивается компилятором. То, как вы обрабатываете проверенные исключения, зависит от варианта использования.

Предполагалось, что на уровне языка можно будет восстановить эти исключения. Например, API-интерфейсы ввода-вывода обычно генерируют проверенные исключения.

Если вы хотите, чтобы приложение обработало sh, вам необходимо перехватить и выбросить эти исключения или объявить их с throws. например,

void doStuff(String name) throws FileNotFoundException {
  BufferedInputStream bis = new BufferedInputStream(new FileInputStream(name));
  .... do stuff
}

В качестве альтернативы вы можете перебросить исключение и заключить его в непроверенное исключение:

void doStuff(String name) {
  BufferedInputStream bis;
  try {
    bis = new BufferedInputStream(new FileInputStream(name));
  } catch(FileNotFoundException e) {
    throw new RuntimeException(e); 
  }
  .... do stuff
}

Однако, как я уже говорил ранее, это обеспечивается компилятором и в результате есть другой способ обойти это.

Lombok имеет аннотацию @SneakyThrows, которая обходит проверку компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...