нельзя обработать исключения, не проверенные Java, используя блок try / catch? - PullRequest
21 голосов
/ 12 ноября 2011

В учебном пособии я обнаружил , что Unchecked Exception не может быть обработан вашим кодом , т.е. мы не можем использовать блок try/catch, и примеры - это исключения, подобные ArrayIndexOutOfBoundsException, NullPointerException. Но эти исключения могут быть обработаны используя блок try / catch. Я думаю, что я не ясно о концепции!

Также я думаю, что ключевое слово throw можно использовать только с try/catch block.can throw Ключевое слово можно использовать с UncheckedException?

Ответы [ 8 ]

33 голосов
/ 12 ноября 2011

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

Unchecked Exception не может быть обработано вашим кодом, т.е. мы не можем использовать блок try / catch

Конечно, мы можем - но мы не обязаны.

Также я думаю, что ключевое слово throw можно использовать только с try / catch block.can throw Ключевое слово, которое будет использоваться с исключением Unchecked?

Обратите внимание, что есть два ключевых слова:

  • throw явно генерирует созданный вами объект исключения.throw new NullPointerException(); прекрасно работает, хотя явное создание этого конкретного исключения является редкостью, и большинство считает его плохим стилем.
  • throws объявляет, что метод может вызвать это исключение.С неконтролируемыми исключениями это необязательно, но может быть полезно для документирования факта (опять же, обычно не объявляется throws NullPointerException, потому что это в значительной степени само собой разумеющееся).
6 голосов
/ 12 ноября 2011

Все непроверенные исключения могут обрабатываться так же, как и отмеченные - если вы хотите, вы можете пропустить их, заявив, что метод throws им:

public void m() throws RuntimeException {}

Или вы можетеcatch them:

public void m() {
    try {
        // some code
    } catch (RuntimeException re) {
        // do something
    }
}

Следует отметить, что класс RuntimeException действует как универсальное средство для непроверенных исключений (поскольку все непроверенные исключения происходят из него), во многом аналогичным образом.что класс Exception является универсальным для проверенных исключений.

Как уже упоминалось ранее, единственное реальное отличие состоит в том, что для проверенных исключений у вас есть для их обработки (позволяяони пропускают или ловят их), и компилятор позаботится об этом - с другой стороны, обработка непроверенных исключений является необязательной.

Все сводится к ожидаемому использованию каждого типа исключения - выПредполагается, что он сможет восстанавливаться после проверенных исключений (или, по крайней мере, что-то делать с ними, когда они возникают), в то время как для непроверенных исключений не может быть разумного способаo оправиться от них.Это, конечно, немного субъективно.

5 голосов
/ 12 ноября 2011

Они могут обрабатываться , но вам не нужно . Если вы не обработаете их, они будут распространяться и подниматься вверх по стеку вызывающих методов, пока один из них не поймает его. Если этого не произойдет, программа завершится сбоем.

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

.

Кроме того, проверенные исключения полезны для документирования API, который, как вы ожидаете, будет использоваться третьими сторонами. Когда они узнают, что ваш метод может вызвать конкретное исключение, они будут соответствующим образом кодировать и обрабатывать регистр. Если вы используете только непроверенные исключения , все ставки отключены.

Распространенная схема (некоторым людям это не нравится, но в некоторых случаях это нормально, когда вы знаете, что делаете) - заключать выброшенные проверенные исключения в не проверенные.

try {
   ... code that can throw CheckedException ...
} catch (CheckedException oopsSomethingBadHappened) {
    throw new RuntimeException("Something bad happened!", oopsSomethingBadHappened);
}
3 голосов
/ 12 ноября 2011

В дополнение к Гийому:

  • непроверенные исключения обычно являются ошибками программирования, которые не должны происходить вообще, если реализованы правильно (индекс вне границ, нулевой указатель, приведение класса, ...)следовательно, вызывающий / пользователь обычно ничего не может с ними сделать.
  • проверенные исключения генерируются, потому что это было вне контроля программиста (сеть недоступна, файловая система недоступна, одновременные модификации, такие как дублированный первичный ключ ,...)
  • ошибки обычно генерируются JVM, и приложение обычно должно останавливаться (нехватка памяти, переполнение стека, ...)
3 голосов
/ 12 ноября 2011

Простой способ понять разницу - подумать, что проверка относится к компиляции.Если исключение является проверенным исключением, компилятор проверит, что ваш код выдает исключение или обрабатывает его в блоке try / catch во время компиляции.Для непроверенных исключений компилятор не будет делать такую ​​проверку.Вы можете обрабатывать отмеченные / непроверенные исключения таким же образом (с помощью try / catch / throws), разница только в проверках, которые выполняет компилятор.Этот пост имеет приличный пример .

0 голосов
/ 17 мая 2019

Да, вы можете обработать непроверенное исключение, но не обязательно.На самом деле это зависит от разработчика приложения.Ниже приведена возможная причина, по которой я считаю необходимым обрабатывать даже непроверенные исключения.

  • Если ваше приложение имеет большой размер, когда многие разработчики вызывают друг друга API.Лучше обработать непроверенное исключение, иначе в конце произойдет сбой вашей программы, который остановит другие функции.Таким образом, даже простое исключение NullPointerException может остановить работу вашей программы.

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

0 голосов
/ 02 декабря 2018

да, мы можем обработать исключение времени выполнения, пожалуйста, проверьте ниже код

public class Demo {
  static void m1() {
    int a[]=new int [5];
    try {
    a[12]=2;
    }catch(Exception e) {

    }
  }

  public static void main(String[] args) {
    m1();
   try {
    String s=null;

    System.out.println(s.length());
   }catch(Exception e) {

   }
    System.out.println("hello world");
  }
}
0 голосов
/ 12 ноября 2011

Да, вы можете выбросить непроверенные исключения с помощью throw.И да, вы можете перехватывать непроверенные исключения в блоке catch.

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