2010-08-19 2 views
2

просто посмотреть на программу ниже .. ошибка времениJava обработка исключений в наследство

import java.io.*; 
import java.rmi.*; 
class class1 
{ 
public void m1() throws RemoteException 
{ 
System.out.println("m1 in class1"); } } 

class class2 extends class1 
{ 
    public void m1() throws IOException 
{ 
    System.out.println("m1 in class2"); 

} } 

class ExceptionTest2 
{ 
public static void main(String args[]) 
{ 
    class1 obj = new class1(); 
    try{ 
obj.m1(); 
} catch(RemoteException e){ System.out.println("ioexception"); } 

} } 

компиляции ..... не может переопределить m1() метод

Теперь, если я заменю RemoteException в родительском классе с IOException и наоборот в классе child. Затем он компилируется.

Любые другие проверенные комбинации исключений здесь не работают, даже если я использую проверенные исключения, которые находятся на одном уровне.

Теперь я смущен, почему переопределение происходит только в одном случае, а не в других случаях ??? Я буду очень благодарен за ваш ответ.

+0

Вы уже разместили этот вопрос http://stackoverflow.com/questions/3520596/i-am-learning-the-exception-handling-in-java-basically-in-inheritance –

ответ

0

RemoteException - это IOEception, но не наоборот. Поскольку класс 2 расширяет класс 1, все заброшенные исключения должны быть совместимы с исключениями суперкласса. Когда class1.m1 генерирует исключение IOException, class2.m1 может вызывать исключение RemoteException, поскольку это специализация исключения IOException.

0

Потому что два метода с теми же сигнатурами не могут вызывать разные виды исключений.

2

RemoteException более конкретно, чем IOException, поэтому вы можете заявить, что член класса m1() класса наследует это. (RemoteException наследуется от IOException и, следовательно, RemoteException - особый вид IOException).

Это не работает наоборот: указав, что ANY объекта типа class1 бросает в его члене m1() в RemoteException, вы не можете определить, что тот же самый метод в class2 бросает что-то более общее (потому что class2 типа объекты также являются объектами типа class1).

3

Exceptions правило в Inheritance выглядит следующим образом:

«Когда подкласс переопределяет метод в родительском классе, то подкласс определение метода может указать только все или подмножество классов исключений в предложении о parentthrows метод класса (или переопределенный метод) ".

RemoteException наследует IOException, так RemoteException класс ребенка и IOEXception является суперкласса. Это означает метод подкласса (класс2), который переопределяет метод родительского класса (class1), который выдает IOException, может throwRemoteException, но не наоборот.