Проходя лекцию с исключениями у меня возникли вопросы, на которые в лекциях не было полного ответа.
Поэтому я решил задать несколько конкретных вопросов у вас, и получить конкретные ответы, вместо того что бы копаться в гугле 1000 лет.
Как правильно поступать с исключениями:
1. Ловить и обрабатывать постоянно?
2. Только пробрасывать?
3. Вообще не ловить?
4. Может стоит ловить все и обрабатывать? Если да то почему, если нет, аналогично – почему?
5. Для чего создавать объект-исключение?
try {
throw new RuntimeException();
} catch(Exception except) {
System.out.println("Перехватили исключение");
throw except;
}
- какой смысл в коде выше создовать объект и сразу выбрасывать его в блоке catch(){}
6. Зачем повторно выбрасывать исключение?
try {
int d = 2/0;
} catch(Exception except) {
System.out.println("Перехватили исключение");
throw except;
}
7. Допустим исключение было проброшено, что с ним будет дальше?
8. Объясните почему код ниже так работает, а именно:
- есть требование в задаче - В блоке catch в консоли должна выводиться переменная answer, чтобы после ввода с клавиатуры "ок" все ранее введенные строки вывелись в консоли в обратном порядке.
- каким образом вообще это будет работать, если я даже не прописывал "вывод в консоли в обратном порядке".
- для чего в этом коде выбрасывается новое исключение? как это влияет на программу? и почему без этого "выбрасывания" строки введенные ранее не выведутся?
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
buyElephant(null, scanner);
}
static void buyElephant(String answer, Scanner scanner) {
if (answer == null) {
System.out.println("Купи слона");
} else if (answer.toLowerCase().equals("ок")) {
System.out.println("Так-то лучше :) Список твоих отговорок:");
throw new SecurityException();
} else {
System.out.println("Все говорят \"" + answer + "\", а ты купи слона");
}
answer = scanner.nextLine();
try {
buyElephant(answer, scanner);
} catch (Exception e) {
System.out.println(answer);
throw e;
}
}
9. Зачем нам checked-исключения?
- Когда мы пишем их в сигнатуре метода, мы как бы предупреждаем что тут может возникнуть исключение, однако почему бы его сразу не обработать, и все, предупреждать не нужно.
Например написал я : bufferedReader.readLine();
readLine() – будет подчеркнуто, что бы избавиться от подчеркивания нужно либо написать в сигнатуре метода throws IOException, либо обернуть в блок try{} и обработать исключение в catch().
- так вот, почему бы всегда не обрабатывать, и что будет если пробросить(куда пойдет это исключение)?
p.s. Спасибо за ответы!