2010-05-28 3 views
7

Почему вы не можете бросить 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

+0

Какая у вас ошибка? – Simon

+0

В нем говорится: незарегистрированное исключение java.lang.InterruptedException; должен быть пойман или объявлен брошенным – fireshadow52

ответ

13

Вы можете бросить его, только если метод, который вы пишете , объявляет тем, что он выбрасывает 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 почти наверняка не делать то, что вы ожидаете, что это ...)

+0

@ Downvoter: Позаботьтесь, чтобы объяснить? –

+0

Или он мог справиться с исключением в блоке 'catch'. Во всяком случае, хорошее объяснение того, как работают исключения. – amphetamachine

+0

Спасибо МНОГО! Это действительно помогло: D – fireshadow52

0

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

+0

Ну, не совсем - вы можете заявить, что вы собираетесь бросить его, чтобы заставить * вызывающего * поймать или перебросить его. –

+0

Я упомянул, что в первом предложении мое второе предложение должно читать «... и не быть вынуждено компилятором« обрабатывать »его». Это было бы более ясно. –

3

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

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

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

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

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

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

Для получения более подробной информации см. Sun Java Tutorial about exceptions.

+0

Возможно, стоит упомянуть, что вы также можете бросать экземпляры классов, отличных от Exception, из Throwable. Это исключения, но не Исключения :) –

+0

@ Да, но это более продвинутый вопрос, который выходит за рамки того, что спрашивает плакат, я не хотел делать это полным курсом по исключениям на Java ... – Jesper

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