2014-12-02 4 views
0

Быстрый вопрос, мне немного сложно обернуть голову вокруг того, как работают исключения. Я понимаю, что вы можете вложить исключение в заявлении, еслиJava Custom Exception Criteria

т.е.
int i = 0; 
if (i == 0) { 
    throw new Exception("i cannot be 0"); 
} 

Но я не понимаю, где в Try/поймать блок, где критерии исключения удовлетворяются. В моем классе мы должны создать наше собственное исключение, в этом случае код указано выглядит следующим образом:

public class NegativeValueException extends Exception{ 

    public NegativeValueException() { 
      super("Numberic values must be nonnegative."); 
     } 

} 

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

int i = 1; 
try { 
    i = -1; 
} catch (NegativeValueException e) { //Thrown exception because the value is negative. 
    //Where is the criteria that catches this exception? 
} 
+0

'catch' _is_ критерии. Если «NegativeValueException» _thrown_, оно будет поймано. –

+0

Но где определяется улов? В какой момент кода он проходит и говорит «хорошо, ловя исключения, ЭТО это NegativeValueException, запустите этот код». – acupajoe

ответ

1

// Вызывается исключение, так как отрицательное значение.

Вы говорите об этом, но NegativeValueException не будет выбрасываться, если вы специально не написали код для этого.

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

В вашем примере, модифицировано бросить исключение,

int i = 1; // 1 
try { 
    i = -1; // 2 
    if (i < 0) throw new NegativeValueException(); // 3 
} catch (NegativeValueException e) { //Thrown exception because the value is negative. // 4 
    //Where is the criteria that catches this exception? // 5 
} 

Java отображался бы что-то вроде

NegativeValueException - Between 2 and 3 - Goto 4 

Теперь, если при выполнении 2 или 3, а NegativeValueException брошен, виртуальная машина будет перейдите в таблицу исключений, выясните, какой оператор переходить на нее и делать это, связывая исключение броска с параметром catch.

+0

Хорошо, это имеет смысл, теперь правильный способ бросить пользовательские исключения - это поставить критерии (ваш оператор if) в блок try? – acupajoe

+2

@SCHULTZ Если 'NegativeValueException' не может быть или не может быть выбрано в блоке' try', тогда нет смысла иметь соответствующий блок 'catch'. –

+0

Gotcha хорошо, очень ценю помощь! – acupajoe