В чем разница между "throws" с именем метода и перехватом исключения? - PullRequest
5 голосов
/ 23 августа 2011

Я очень плохо знаком с обработкой исключений в Java, поэтому этот вопрос может показаться глупым, но, пожалуйста, дайте ему ответить. Предположим, у меня есть метод A , в котором некоторая часть кода может выдать исключение B , тогда в чем разница между перехватом исключения в методе или записью объявления метода как: -

void A() throws B{
     ----//----
     }

Ответы [ 9 ]

9 голосов
/ 23 августа 2011

Разница заключается в том, как вы вызываете метод.

  1. Если в сигнатуре вашего метода указано throws Exception, код, вызывающий ваш метод, должен обрабатывать Exception либопоймать его [через предложение catch] или отбросить обратно [через предложение throws].

  2. Если вы catch Exception, вы в основном пытаетесь справитьсяException вы сами и код, который вызывает ваш метод, не должны иметь дело с Exception.

Мой совет следующий:

  1. Если вы считаете, что можете справиться и оправиться от Exception, то вам следует catch и сделать все необходимое.

  2. Если вы не можете правильно справиться с Exceptionкоторые не catch это, вы должны бросить его обратно.

ПРИМЕЧАНИЕ. Это плохой стиль программирования для catch и Exception и повторного выброса назад [хотя вы можете это сделать].Если вы оберните Exception другим, тогда все в порядке.Но в этом случае имеет смысл обернуть исключение другим.

Обновление: идея заключается в том, что независимо от того, сколько слоев имеет ваше приложение, кто-то имеет , чтобы справиться с этим.throws Exception пункт.Вы не можете просто позволить StackTrace показываться пользователю в середине его активности с приложением.Необходимо рассмотреть вопрос: «Можете ли вы исправить ошибку и возобновить обработку?»Если да, то обработайте Исключение, иначе выбросьте его обратно на уровень, который может хотя бы показать значимое сообщение пользователю о том, что произошло.

2 голосов
/ 23 августа 2011

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

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

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

2 голосов
/ 23 августа 2011

Разница в том, что если вы поймаете B в теле метода, вы обработаете исключение.Вы можете выбросить другое исключение, но если вы не сделаете этого, проблема считается решенной в том, что касается Java.Используя объявление throws в сигнатуре метода, вы указываете, что ваш метод может генерировать исключения типа B и другие фрагменты кода, использующие его, будут вынуждены иметь дело с ним, или выкидывать его дальше.

2 голосов
/ 23 августа 2011

Если вы поймаете исключение в A(), вы должны отреагировать на ошибку в вашем методе A(), например, повторив попытку кода, вызывающего ошибку, записав ошибку и т. Д.

Если вы (пере) выбросить исключение, вы ожидаете / форсируете метод, вызвавший A(), чтобы обработать исключение, или оно останется необработанным.

1 голос
/ 23 августа 2011
  1. Выяснение исключения: Вы предоставляете заполнитель для обработки исключительной ситуации.Поэтому, если какая-либо часть кода в блоке try сгенерирует это исключение, он попадет в блок catch и будет выполнен фрагмент кода.

  2. Исключение Throwing: Вы не обрабатываетеисключение.Таким образом, если код в методе, который выбрасывает исключение в заголовок, создает упомянутое исключение, он будет брошен в стек метода.поэтому, если код подобен:

method1()   {
x.method2();
  }
  method2() {   
   method3(); 
  }  
method3() throws SomeException   {  .....  ......   }

Тогда, если код в method3 генерирует SomeException, это будет распространено на method2, если method2 также не обрабатываетисключение затем для method1, аналогично, в стеке методов.

1 голос
/ 23 августа 2011

Когда вы перехватываете исключение, это означает, что вы каким-то образом обработаете исключение в своей части catch. Но когда вы объявляете, что A () генерирует B, вы просто говорите, что A () -функция может генерировать B-исключение. Поэтому, когда кто-то использует функцию A (), он знает, что должен обработать исключение B или выбросить его вперед.

1 голос
/ 23 августа 2011

Если вы поймаете исключение в методе, вы по существу обрабатываете его (даже если вы ничего не делаете с ним), и вызывающая сторона может (не обязательно) знать об этом; в противном случае вы указываете вызывающим метода, что может пойти не так, и какие ошибки они ожидают обработать, и если они этого не сделают, то их приложение обязательно сообщит им, когда произойдет исключение.

1 голос
/ 23 августа 2011

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

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

Я бы посоветовал вам следовать этому уроку .

1 голос
/ 23 августа 2011

Когда вы выбрасываете исключение, вы «выбрасываете» его обратно в вызывающую функцию этого метода.

С другой стороны, «перехват» его блоком try-catch позволяет вам обрабатывать его внутри метода.

try {
//Do your stuff here
}

catch (Exception ex) {
System.out.println("I just caught exception = " + ex);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...