/ / Изхвърлете изключенията - java, изключение, обработка на изключения, проверени изключения

Хвърли проверени изключения - java, изключение, обработка на изключения, проверени-изключения

Някои от моите методи в Java хвърлят изключения такивакато NoSuchElementException, IllegalArgumentException и т.н. Но когато се използват тези методи, тези изключения изглеждат без отметка. С други думи, обаждащият се от моите методи не е длъжен да прави опитвам / хвана на моите методи, които хвърлят тези изключения. Четох около това изглежда, че изключения по подразбиране са "проверени" и само грешки са тези, които не са отметнати. Но по някакъв начин изключенията, които хвърлям, също са непроверени. Странно е.

Как мога да се уверя, че когато методът ми изхвърли изключение, повикващият ТРЯБВА да улови изключението по време на компилация? Просто казано, как мога да хвърля едно изключено за проверка?

Благодаря!

Отговори:

6 за отговор № 1

само RuntimeException и неговите подкласове не са отметнати. (Добре, Error и неговите подкласове също са, но не трябва да се забъркваш Errors.) Всичко, което трябва да направите, за да хвърлите изключение, е да се уверите, че не се разпростира RuntimeException.


3 за отговор № 2

Дали е отметнато изключение или не е НЕ как го хвърляте или декларирате, това е самозависи от това дали избраното от вас изключение е получено от RuntimeException или не. Тези, които сте изброени по-горе, всички са извлечени от RuntimeException и затова клиентите на вашия метод не трябва да ги хващат.


3 за отговор № 3

Всички подкласове на Throwable се проверяват, с изключение на подкласовете Error и RuntimeException. (Можете да подклас Throwable директно)

Компилаторът проверява тези изключения, но те нямат специално място по време на изпълнение. т.е. можете да хвърлите проверено изключение без знанието на компилатора и ще се държи нормално.

например

public static void throwChecked(Throwable t) /* no throws clause */ {
Thread.currentThread().stop(t);
}

public static void main(String... args) /* no throws clause */ {
throwChecked(new Throwable());
}

Това компилира и отпечатва Throwable, както бихте очаквали.


1 за отговор № 4

Мисля, че трябва да направите крачка назад и да научите теорията зад себе си защо да хвърляте изключено срещу непроверено изключение. Най- Java настойнически по изключения е добър ресурс.

От страницата, озаглавена Неконтролирани изключения - Спорът:

Изключенията по време на изпълнение представляват проблеми, които са резултат от проблем с програмирането, и като такъв, клиентският код на API не може разумно да се очаква да се възстанови от тях или да ги обработи по някакъв начин.


1 за отговор № 5

Виж това хамалски, може да помогне (надявам се, че не е ОТ).

public class Test {

// No throws clause here
public static void main(String[] args) {
doThrow(new SQLException());
}

static void doThrow(Exception e) {
Test.<RuntimeException> doThrow0(e);
}

@SuppressWarnings("unchecked")
static <E extends Exception> void doThrow0(Exception e) throws E {
throw (E) e;
}
}

0 за отговор № 6

Изключения, които се простират RuntimeException не трябва да се декларират.

Можете да декларирате метода: throws Exception или дори throws Throwable и това трябва да се извърши (въпреки че не е препоръчително).