2009-04-03 1 views
2

Представьте меня есть методы:Java исключение сцепления вопрос

public static void funcA() {...} 

public static void funcB() 
{ 
    byteBuffer.wrap(someByteArray, 0, someByteArra.length); 
} 

В Java API:

public static ByteBuffer wrap(byte[]array, int offset, int length) 
{ 
    try { 
     return new HeapByteBuffer(array, offset, length); 
    } catch (IllegalArgumentException x) { 
     throw new IndexOutOfBoundsException(); 
    } 
} 

функции цепи: funcB() -> ByteBuffer.wrap()

Мой вопрос так как funcB не нужно делать блок try-catch вокруг этого java-метода api, который генерирует исключение. funcB компилируется без блока try-catch. Я считаю, что ответ связан с тем, что метод java api генерирует исключение, но НЕ ОБНАРУЖЕН как «throws IndexOutOfBoundsException»

функциональная цепочка: funcA() -> funcB() -> ByteBuffer.wrap (.. .)

Мой следующий вопрос, когда я DO изменения funcB к «funcB() бросает IndexOutOfBoundsException» как же funcA не нужно, чтобы поймать брошенный исключение funcB в? Разрабатывает ли компилятор глубину и понимает, что ByteBuffer.wrap (...) не объявляется как «wrap() генерирует IndexOutOfBoundsException», поэтому всем вызывающим абонентам на самом деле не нужно ничего поймать даже подзаголовков (funcB в этом случае) на самом деле объявляются как «funcB throws IndexOutOfBoundsException»?

Извините, если это было непонятно или трудно понять.

Пожалуйста, помогите.

JBU

ответ

9

IndexOutofBoundsException расширяет RuntimeException. Его исключение во время выполнения не нужно проверять.

См unchecked exceptions - the controversy.

+0

так в чем смысл наличия бросков, если есть исключения, которые не нужно поймать? – jbu

+0

Иногда вам нужно, чтобы ОПЦИЯ ловила исключение, не требуя явного перебора. –

+0

А, это будет хороший вариант. Я вижу, что это ведет к лени. – jbu

4

В вершине иерархии исключений является java.lang.Throwable. Это проверенное исключение (компилятор заставляет вас его поймать или объявить, что вы его выбрали).

Ниже Throwable существует исключение, также исключенное исключение и ошибка, исключенное исключение (компилятор не предупреждает вас об этом).

Ниже приведено исключение RuntimeException, а также неконтролируемое исключение.

Таким образом, что разработчики Java предназначены исключения для использования является:

  • Exception, то, что может пойти не так
  • ошибка, низкие вещи на уровне, что может пойти не так, и программа не может оправиться от
  • RuntimeException, ошибки программиста (например, прохождение конца массива или вызов метода на null).

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

Не все согласны с намерением дизайнеров Java на этом и решили использовать RuntimeException для обозначения других вещей, кроме ошибки программиста.