Как словить ошибку и вместо нее бросить кастомную?

Есть такая переменная, куда вводятся числа.

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() }
→ Ссылка
Автор решения: Stanislav Volodarskiy

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)
→ Ссылка