бросить исключение - PullRequest
8 голосов
/ 28 мая 2010

Почему вы не можете выбросить InterruptedException следующим образом:

try {
    System.in.wait(5) //Just an example
} catch (InterruptedException exception) {
    exception.printStackTrace();
 //On this next line I am confused as to why it will not let me throw the exception
    throw exception;
}

Я перешел на http://java24hours.com,, но он не сказал мне, почему я не мог вызвать InterruptedException. Если кто-нибудь знает почему, ПОЖАЛУЙСТА скажи мне! Я в отчаянии! : S

Ответы [ 3 ]

14 голосов
/ 28 мая 2010

Вы можете выбросить его, только если метод, который вы пишете , объявляет , что он выдает InterruptedException (или базовый класс).

Например:

public void valid() throws InterruptedException {
  try {
    System.in.wait(5) //Just an example
  } catch (InterruptedException exception) {
    exception.printStackTrace();
    throw exception;
  }
}

// Note the lack of a "throws" clause.
public void invalid() {
  try {
    System.in.wait(5) //Just an example
  } catch (InterruptedException exception) {
    exception.printStackTrace();
    throw exception;
  }
}

Вы должны прочитать проверенные исключения для получения более подробной информации.

(Сказав это, вызов wait() на System.in почти наверняка не делает того, что вы ожидаете ...)

3 голосов
/ 28 мая 2010

В Java существует два вида исключений: проверено и не проверено исключения.

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

Классы исключений, которые являются подклассами java.lang.RuntimeException (и самого RuntimeException), являются непроверенными исключениями. За этими исключениями компилятор не выполняет проверку - поэтому вам не нужно перехватывать их или указывать, что вы можете их выбросить.

Класс InterruptedException является проверенным исключением, поэтому вы должны либо перехватить его, либо объявить, что ваш метод может его выбросить. Вы генерируете исключение из блока catch, поэтому вы должны указать, что ваш метод может его выбросить:

public void invalid() throws InterruptedException {
    // ...

Классы исключений, которые расширяют java.lang.Exception (кроме RuntimeException и подклассов), являются проверенными исключениями.

См. Учебник Java по исключениям для получения подробной информации.

0 голосов
/ 28 мая 2010

InterruptedException не является RuntimeException, поэтому оно должно быть перехвачено или проверено (с предложением throws в сигнатуре метода). Вы можете только выдать RuntimeException и не быть вынужденным компилятором его перехватить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...