多个重载方法:null是否等于NullPointerException?

时间:2015-02-12 06:11:45

标签: java reference nullpointerexception null overloading

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方法

2 个答案:

答案 0 :(得分:38)

如果有多个重载方法可能使用给定参数调用(在您的情况下为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)甚至更具体。

如果用另一个Exception子类替换NullPointerException,编译器将选择那个。

另一方面,如果你创建一个像testMethod(IllegalArgumentException e)这样的附加方法,编译器会抛出一个错误,因为它不知道选择哪一个。

答案 1 :(得分:9)

编译器将尝试匹配最具体的参数,在本例中为NullPointerException。您可以在Java语言规范的15.12.2.5. Choosing the Most Specific Method 部分中看到更多信息:

  

如果多个成员方法都可访问且适用于a   方法调用,有必要选择一个提供   运行时方法调度的描述符。 Java编程   language使用选择最具体方法的规则。

     

非正式的直觉是一种方法更具体   如果可以传递第一个方法处理的任何调用,则为另一个   没有编译时类型错误的另一个。

     

[...]