Обработка исключений: throw, throws и Throwable

Может ли кто-нибудь из вас объяснить, в чем разница между throw, throws и Throwable и когда что использовать?


person Sumithra    schedule 15.10.2010    source источник
comment
В Java нет ни того, ни другого. У него есть метод throw класса Throwable, а также ключевое слово throws, используемое в заголовках методов. Это две совершенно разные вещи. Сначала забудьте о throws и просто выясните, что делает throw. throws требуется только для того, чтобы компилятор был доволен.   -  person Hot Licks    schedule 09.01.2015


Ответы (8)


  • throws : используется при написании методов, чтобы объявить, что рассматриваемый метод выдает указанное (проверенное) исключение.

    В отличие от проверенных исключений, исключения времени выполнения (NullPointerExceptions и т. д.) могут быть вызваны без объявления метода throws NullPointerException.

  • throw: Инструкция для фактического создания исключения. (или, точнее, Throwable).

    За ключевым словом throw следует ссылка на Throwable (обычно исключение).

Пример:

введите здесь описание изображения


  • Throwable: класс, который вы должны расширить, чтобы создать свой собственный метательный.

Пример:

введите здесь описание изображения


person aioobe    schedule 15.10.2010
comment
За добавление скриншотов к фрагментам кода +1 вам, сэр. Хороший ответ. - person luis.espinal; 22.01.2013
comment
Вау, спасибо за подробное объяснение. - person fruqi; 14.08.2015
comment
-1. IllegalArgumentException не является CheckException, ссылка. И RuntimeExceptions не надо ловить, их можно как минимум кидать. - person srk; 05.08.2017

  • throw: оператор для создания объекта t, где t instanceof java.lang.Throwable должно быть истинным.
  • throws: токен подписи метода для указания проверенных исключений thrown этим методом.
  • java.lang.Throwable: родительский тип всех объектов, которые можно бросать (и ловить).

См. здесь руководство по использованию исключений.

person oksayt    schedule 15.10.2010

Это действительно легко понять.

java.lang.Throwable:

Класс Throwable является надклассом всех ошибок и исключений в языке Java. Только объекты, которые являются экземплярами этого класса (или одного из его подклассов), выбрасываются виртуальной машиной Java или могут быть выброшены оператором Java throw. Точно так же только этот класс или один из его подклассов может быть типом аргумента в предложении catch. Дополнительно

Ключевое слово throws используется в объявлении метода, это указывает, какое исключение [класс Throwable] мы можем ожидать от этого метода.

Ключевое слово throw используется для создания объекта, который является экземпляром класса Throwable.


Чтобы увидеть пример:

Создаем себе класс исключения

public class MyException super Exception {

}

Мы создаем метод, который создает объект из нашего класса исключений и выбрасывает его с помощью ключевого слова throw.

private  void throwMeAException() throws MyException //We inform that this method throws an exception of MyException class
{
  Exception e = new MyException (); //We create an exception 

  if(true) {
    throw e; //We throw an exception 
  } 
}

Когда мы собираемся использовать метод throwMeAException(), мы вынуждены позаботиться о нем особым образом, потому что у нас есть информация о том, что он что-то выдает, в этом случае у нас есть три варианта.

Первый вариант использует блокировку try и catch для обработки исключения:

private void catchException() {

   try {
     throwMeAException();
   }
   catch(MyException e) {
     // Here we can serve only those exception that are instance of MyException
   }
}

Второй вариант - передать исключение

   private void passException() throws MyException {

       throwMeAException(); // we call the method but as we throws same exception we don't need try catch block.

   }

Третий вариант - поймать и повторно выдать исключение

private void catchException() throws Exception  {

   try {
     throwMeAException();
   }
   catch(Exception e) {
      throw e;
   }
}

Возобновляя, когда вам нужно остановить какое-то действие, вы можете сгенерировать исключение, которое будет возвращаться до тех пор, пока не станет сервером с помощью некоторого блока try-catch. Где бы вы ни использовали метод, выбрасывающий исключение, вы должны обрабатывать его блоком try-catch или добавлять объявления к своим методам.

Исключением из этого правила являются java.lang.RuntimeException те, которые не нужно объявлять. Это отдельная история как аспект использования исключений.

person Damian Leszczyński - Vash    schedule 15.10.2010
comment
Хороший пример. Спасибо за ваше время и усилия, чтобы объяснить мне это. - person Sumithra; 15.10.2010

throw — используется для создания исключения. Для оператора throw требуется один аргумент: объект класса throwable.

throws — используется для указания того, что метод может генерировать исключение

Throwable — это надкласс всех ошибок и исключений в языке Java. вы можете выбрасывать только объекты, производные от класса Throwable. throwable содержит снимок стека выполнения своего потока на момент его создания

person Sachin Shanbhag    schedule 15.10.2010

Throw используется для генерации исключения, throws (если я правильно догадался) используется для указания того, что метод может генерировать конкретное исключение, а класс Throwable является надклассом всех ошибок и исключений в Java.

Как создавать исключения

person DixonD    schedule 15.10.2010

Выбросить:

используется для фактического создания исключения, тогда как throws является декларативным для метода. Они не взаимозаменяемы.

throw new MyException("Exception!);

Выдает:

Это следует использовать, когда вы не используете оператор try catch в своем коде, но знаете, что этот конкретный класс способен генерировать такое-то и такое-то исключение (только проверенные исключения). В этом вы не используете блок try catch, а пишете, используя предложение throw в соответствующей точке вашего кода, и исключение выдается вызывающему методу и обрабатывается им. Также ключевое слово throws используется, когда функция может генерировать проверенное исключение.

public void myMethod(int param) throws MyException 
person Community    schedule 21.05.2013

Существует 2 основных типа исключений:
Исключения во время выполнения (неотмеченные): например. NullPointerException, ClassCastException,..
Проверенные исключения: например. FileNotFoundException, CloneNotSupportedException, ..

Исключения времени выполнения — это исключения, возникающие во время выполнения, и разработчик не должен пытаться их перехватывать или останавливать. Вы пишете код только для того, чтобы их избежать, или выдаете команду throw, когда выполняются критерии ошибки. Мы используем throw внутри тела метода.

public Rational(int num, int denom){
if(denom <= 0) {
  throw new IllegalArgumentException("Denominator must be positive");
}
this.num=num;
this.denom=denom;
}

Однако для проверенных исключений JVM ожидает, что вы их обработаете, и выдаст ошибку компилятора, если она не будет обработана, поэтому вы объявляете, что он выдает этот тип исключения, как показано ниже в методе clone().

Class Employee{
public Employee clone() throws CloneNotSupportedException{
    Employee copy = (Employee)super.clone();
    copy.hireDate = (Date)hireDate.clone();
    return copy;
}
}
person karto    schedule 06.02.2018

Тот же ответ, что и выше, но с удовольствием от копирования и вставки:

public class GsonBuilderHelper {
    // THROWS: method throws the specified (checked) exception
    public static Object registerAndRun(String json) throws Exception {

        // registering of the NaturalDeserializer
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());
        Gson gson = gsonBuilder.create();

        Object natural = null;
        try {
            // calling the NaturalDeserializer
            natural = gson.fromJson(json, Object.class);
        } catch (Exception e) {
            // json formatting exception mainly
            Log.d("GsonBuilderHelper", "registerAndRun(json) error: " + e.toString());
            throw new Exception(e);  // <---- THROW: instance of class Throwable. 
        }
        return natural;
    }
}
person msysmilu    schedule 04.03.2015