Как словить ошибку и вместо нее бросить кастомную?
Есть такая переменная, куда вводятся числа.
Scanner cin = new Scanner(System.in)
int number = cin.nextInt();
Если я введу букву, то словлю InputMismatchException. Я хочу словить эту ошибку через try/catch и вместо нее бросить собственную ошибку CustomException. Я знаю как ловить ошибку, но не понимаю, как ее заменить. Как это можно реализовать ?
Ответы (2 шт):
Scanner cin = new Scanner(System.in)
int number = -1;
try { number = cin.nextInt(); } catch(Exception e) { throw new CustomException() }
Java поддерживает возможность оборачивать исключения так чтобы можно было "менять" их тип при передаче вверх по стеку (chained exceptions). В примере ниже использован конструктор класса Exception, который оборачивает одно исключение в другое (ищите строку с super):
import java.util.InputMismatchException;
import java.util.Scanner;
public class WrapException {
public static class CustomException extends Exception {
public CustomException(String message, Throwable cause) {
super(message, cause);
}
}
public static void main(String... args) throws Exception {
Scanner cin = new Scanner(System.in);
try {
cin.nextInt();
} catch (InputMismatchException e) {
throw new CustomException("custom exception", e);
}
}
}
Строка Caused by: ... обозначает что одно исключение порождено другим исключением. Java позволяет создавать матрешки из исключений.
$ javac WrapException.java $ echo 42 | java WrapException $ echo a | java WrapException Exception in thread "main" WrapException$CustomException: custom exception at WrapException.main(WrapException.java:16) Caused by: java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:864) at java.util.Scanner.next(Scanner.java:1485) at java.util.Scanner.nextInt(Scanner.java:2117) at java.util.Scanner.nextInt(Scanner.java:2076) at WrapException.main(WrapException.java:14)