2015-05-08 2 views
7

Я пытался выяснить ответ на этот вопрос, но не получил удовлетворительного объяснения. Вот некоторые предпосылки:Обработка исключений с помощью Java7

Java 7 позволяет нам улавливать несколько исключений в одном блоке catch, если эти исключения из другой иерархии. Например:

try { 
    // some code 

} catch(SQLException | FileNotFoundException e) { 
    e.printStackTrace(); 
} catch(Exception e) { 
    e.printStackTrace(); 
} 

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

try { 
    // some code 
} catch(FileNotFoundException e) { 
    e.printStackTrace(); 
} catch(IOException e) { 
    e.printStackTrace(); 
} 

Но если я пытаюсь написать код, как показано ниже компилятор жалуется, что «Исключение FileNotFoundException уже пойманы альтернативной IOException "

try { 
    // some code 
} catch(FileNotFoundException | IOException e) { // compiler error 
    e.printStackTrace(); 
} 

Теперь мой вопрос: Почему компилятор выдает сообщение об ошибке в последнем случае, не может это цифра что FileNotFoundException - специальный случай IOException? Это сохранит дублирование кода, когда моя логика обработки исключений будет такой же.

+0

Если вы работаете с 'IOException', то не нужно использовать тот же блок обработчика для' FileNotFoundException' –

ответ

13

Почему компилятор выдает сообщение об ошибке в последнем случае, она не может понять, что FileNotFoundException является частным случаем IOException?

Потому что FileNotFoundException является подклассом IOException. Другими словами, часть «FileNotFoundException |» является избыточной.

Причины, почему код ниже в порядке ...

} catch(FileNotFoundException e) { 
    ... 
} catch(IOException e) { 
    ... 
} 

... потому, что здесь дело IOException оговорки: Если SocketException брошено, например, он проедет по FileNotFoundException частям, и попадаются в пункт IOException.

0

При перехвате исключения вы делаете свои предложения о выкупе наиболее конкретными для самых общих.

Рассмотрим следующую иерархию:

class MyException extends Exception {} 

class MySubException extends MyException {} 

Если часть вашего кода бросает MyException УД другая часть броска MySubException вы должны поймать MySubException первым.

catch(MySubException e){ 

} catch(MyException e){ 

} 

Это то же самое, что и при использовании оператора instanceof.

Если вы проверяете, является ли экземпляр MySubException экземпляром MyException, результат будет правдой.

mse = new MySubException(); 

if(mse instanceof MyException){ 
    println("MyException"); 
} else if(mse instanceof MySubException){ 
    println("MySubException"); 
} 

Этот фрагмент кода никогда не будет печатать «MySubException».

mse = new MySubException(); 

if(mse instanceof MySubException){ 
    println("MySubException"); 
} else if(mse instanceof MyException){ 
    println("MyException"); 
} 

Это будет правильный порядок.

0

Его потому, что FileNotFoundException расширяет IOException, поскольку вы сказали, что он имеет одинаковую иерархию, вы не можете добавить их в тот же блок catch.

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