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

Ani*_*wda 25 java null overloading reference 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);
    }   
}
Run Code Online (Sandbox Code Playgroud)

输出:调用NullPointerException方法

Tho*_*ets 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)编译器会抛出一个错误,因为它不知道选择哪一个.

  • @PatrickCollins NullPointerException不是特定于null,它比Exception更具体,这意味着所有可能参数的较小子集对于此异常而言比对Exception有效.null只是所有三种方法的可能值. (5认同)
  • @Runcorn你真的尝试过吗?它的工作原理如我在这里的回答所述. (2认同)
  • @PatrickCollins:你以奇怪的方式使用"继承"这个词; 当派生类型具有基类型的所有成员时,类型*从另一个继承*.我认为你使用"继承"来表示"可以隐式转换为",这是一个非常不同的事情.Null是*隐式可转换*到许多类型,但这并不意味着null表达式具有包含所有其他类型的*成员*的类型. (2认同)
  • @PatrickCollins:为了解决我们的问题,"null会转换为离对象最远的东西吗?" - 有点.考虑它的更好方法是:null可以转换为许多类型.在那些转换中,有些*比其他转换更好*.转换为*更具体*类型*比转换为*特定*类型更好*.重载决策的工作是在各种转换之间给出一堆 - 可能相互矛盾 - "更好"的关系,推导出*best*方法. (2认同)

Joh*_*ues 9

编译器将尝试匹配最具体的参数,在本例中为NullPointerException.您可以在Java语言规范的15.12.2.5节中查看更多信息.选择最具体的方法 :

如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体.

[...]