2016-06-21 2 views
0

Вот два класса, которые отвечают за EOF и Nfn исключений:Исключения или как это работает из «внутри»?

public class FileNotFoundException extends IOException { 

    public FileNotFoundException() { 

    super(); 

    } 

} 

class EOFException extends IOException { 

    public EOFException() { 

    super(); 

    } 

} 

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

Я не могу понять, где логическая часть кода, которая отвечает за EOF или ситуацию с NFN? Если разница между ними содержит попытаться поймать блок, то давайте попробуем следующий:

try { 

    // code with possible IOException 

} 

catch(FileNotFoundException e) { 

    // what to do if FNF has happened 

} 

catch(EOFException e) { 

    // what to do if EOF has happened 

} 

Теперь давайте попробуем изменить FileNotFoundException с EOFException:

try { 

    // code with possible IOException 

} 

catch(EOFException e) { 

    // what to do if FNF has happened 

} 

catch(FileNotFoundException e) { 

    // what to do if EOF has happened 

} 

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

Итак, почему нам нужны два класса, которые выполняют одну и ту же работу?

P.S. тот же вопрос для большинства подклассов класса Throwable. Почему у нас нет только двух подклассов для класса Throwable - одно проверяемое и другое неконтролируемое? Для чего нам нужно столько же классов, которые выполняют одну и ту же работу - просто вызовите конструктор своего суперкласса?

+0

Может быть, так что вы можете сказать разницу между FNF и EOF? – immibis

+0

Если бы был только один, вы бы попробовали {/ * код с возможным IOException * /} catch (CheckedException e) {/ *, как вы узнаете, произошел ли FNF или произошел EOF? * /} ' – immibis

+0

Возможный дубликат [Что нужно для других классов исключений, когда один класс исключения может обрабатывать все типы исключений?] (Http://stackoverflow.com/questions/34329705/what-is-the-need- of-other-exception-classes-when-exception-class-alone-can-handl) –

ответ

0

Создатели, о которых вы упомянули, касаются создания этих объектов с помощью оператора new. «Логическая часть, которая отвечает за EOF или FNF ситуаций» в этом коде, который создает и кидает эти объекты с командами, как throw new FileNotFoundException();

+0

Команда new FileNotFoundException() только что создала объект класса FileNotFoundException, который равен классу EOFException() из-за упомянутой выше причины. Если это логическая часть, это значит, что они имеют одну и ту же логику, а один класс просто дублирует другую. –

+0

Что имеет значение, это код, который окружает команду 'throw new FileNotFoundException();' и команду 'throw new EOFException();'. I.e. 'if (/ * файл недоступен * /) {throw new FileNotFoundException();} else if (/ * неожиданный конец файла * /) {throw new EOFException();}', так что вызывающий может белым двумя разными обработчиками для двух разных ситуаций. – AlexD

1

Так зачем нам нужны два класса, которые делают ту же работу?

Есть два различных набора работы случающиеся, есть работа, которую Java делает для вас, когда вы бросаете исключение, т.е. захват трассировки стека и раскрутку стека и т.д. Там также работа что приложения может или не может выбрать сделать на основе типа от Exception, исключение типа является ключом к разработчику, куда поместить код, который делает работы им нужно делать при ловле конкретного типа исключения. Имя объекта позволяет разработчику определить его тип. Обратите внимание, что компилятор не волнует то, что исключения называют то есть два исключения могут так же легко можно было назвать ...

Exception65599 
Exception1729 

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

Это также означает, что большинство исключений делают очень мало, что отличается от того, которое они распространяют, но имеет значение тип.

What's in a name? that which we call a rose By any other name would smell as sweet;

+0

Итак, что у нас есть?))) Класс исключений может обрабатывать все типы исключений, но нам нужны другие классы исключений, потому что их легче читать код? –

+0

Да, это довольно близко. Есть два семейства исключений, проверенные и не отмеченные, и в каждом семействе тип говорит вам, почему он был поднят, и как разработчик я теперь знаю, какие действия мне нужно предпринять в зависимости от типа исключения. Конечно, я мог бы бросить почти любой тип исключения, которого хочу, но, как правило, я пытаюсь не путать потребителя моего кода. – Harry

+0

Вот и все !!!!! Brilliant! Это то, что я хотел услышать с самого начала. Я сказал, что все можно сделать с двумя типами - проверяемыми и неконтролируемыми. Но это было бы слишком сложно для понимания человеком, поэтому у нас есть много одинаковых подклассов с разными именами. Просто конкретизировать различные ситуации исключения и сделать их таким образом более понятным для человека! Я прав? –