Подтвердить что ты не робот

Множественные перегруженные методы: имеет ли значение NullPointerException равное нулю?

public class TestMain {

    public static void methodTest(Exception e) {
        System.out.println("Exception method called");
    }

    public static void methodTest(Object e) {
        System.out.println("Object method called");
    }

    public static void methodTest(NullPointerException e) {
        System.out.println("NullPointerException method called");
    }

    public static void main(String args[]) {
        methodTest(null);
    }   
}

Выход: метод NullPointerException, называемый

4b9b3361

Ответ 1

Если есть несколько перегруженных методов, которые могут быть вызваны с заданным параметром (null в вашем случае), компилятор выбирает наиболее специфический.

См. http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5

В вашем случае methodTest(Exception e) более конкретно, чем methodTest(Object e), так как Exception является подклассом Object. И methodTest(NullPointerException e) еще более определен.

Если вы замените NullPointerException другим подклассом Exception, компилятор выберет тот.

С другой стороны, если вы сделаете дополнительный метод, например testMethod(IllegalArgumentException e), компилятор выкинет ошибку, так как не знает, какой из них выбрать.

Ответ 2

Компилятор будет пытаться соответствовать самому определенному параметру, который в этом случае NullPointerException. Вы можете увидеть дополнительную информацию в Спецификации языка Java, раздел 15.12.2.5. Выбор наиболее конкретного метода:

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

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

[...]