通过获取FileNotFoundException来搞糊涂

时间:2016-01-06 12:41:32

标签: java exception filenotfoundexception

我已经获得了这段代码而只是FileNotFoundException

public class Overload {   
public void method(Object o) {     
    System.out.println("Object");   
    }   
public void method(java.io.FileNotFoundException f) {     
    System.out.println("FileNotFoundException");   
    }   
public void method(java.io.IOException i) {     
    System.out.println("IOException");   
    }   
public static void main(String args[]) {     
    Overload test = new Overload();     
    test.method(null);   
    } 
} 

有什么想法会发生吗?

2 个答案:

答案 0 :(得分:5)

因为它确实访问了最具体的方法,在本例中为method(java.io.FileNotFoundException f)

来自FileNotFoundException

的继承顺序

java.lang.Object -> java.lang.Throwable -> java.lang.Exception -> java.io.IOException -> java.io.FileNotFoundException

正如您所看到的,IOException继承自Object(在某些时候),这使其更具体ObjectFileNotFoundExceptionIOException更具体。最后,编译器决定它应该使用FileNotFoundException作为参数来调用方法。

如果有两种方法同样具体,那么您的代码就不会编译,错误的是方法调用模糊。

答案 1 :(得分:0)

为重载方法选择了最具体的方法参数

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

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