多个重载方法:null 是否等于 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 方法调用


答案 1

如果有几个重载方法可能使用给定参数调用(在您的情况下),编译器会选择最具体的一个。null

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

在你的情况下比 更具体,因为 Exception 是 Object 的子类。而且更具体。methodTest(Exception e)methodTest(Object e)methodTest(NullPointerException e)

如果将 NullPointerException 替换为 Exception 的另一个子类,编译器将选择该子类。

另一方面,如果您创建其他方法(如编译器)将引发错误,因为它不知道选择哪一个。testMethod(IllegalArgumentException e)


答案 2

编译器将尝试与最具体的参数匹配,在本例中为 。有关详细信息,请参阅 Java 语言规范,第 15.12.2.5 节。选择最具体的方法NullPointerException

如果多个成员方法既可访问又适用于方法调用,则需要选择一个成员方法来为运行时方法调度提供描述符。Java 编程语言使用选择最具体方法的规则。

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时类型错误,则一种方法比另一个方法更具体。

[...]