多个重载方法: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方法
如果有多个重载方法可能使用给定参数调用(在您的情况下为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)
这样的附加方法,编译器将抛出一个错误,因为它不知道选择哪一个。
编译器将尝试匹配最具体的参数,在本例中为NullPointerException
。 您可以在Java语言规范的15.12.2.5节中看到更多信息。 选择最具体的方法 :
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。
[…]