2016-01-06 2 views
3

У меня есть этот кусок кода и просто получаю 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); 
    } 
} 

Любые мысли, почему это происходит?

+3

Что вы ожидали? – wero

ответ

5

Поскольку это доступ к наиболее конкретный метод, который в данном случае является method(java.io.FileNotFoundException f)

Наследование заказ от FileNotFoundException

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

Как вы можете видеть, IOException наследует от Object (в какой-то момент), что делает его более конкретным, чем Object. И FileNotFoundException более конкретный, чем IOException. В конце компилятор решает, что он должен вызывать метод с параметром FileNotFoundException.

Если есть два метода, которые одинаково специфичны, ваш код не будет скомпилирован с ошибкой, что существует неоднозначный вызов метода.

0

Наиболее точный метод аргумент был выбран для перегруженных методов

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

Если более чем один метод член является одновременно доступным и применим к вызову метода, необходимо выбрать один, чтобы предоставить дескриптор для отправки метода времени выполнения. Язык программирования Java использует правило, в котором выбран наиболее специфический метод.

Смежные вопросы