2013-11-20 2 views
-5

Мой вопрос прост:Нужно ли использовать «Броски» всякий раз, когда мы используем «бросок»?

В Java всякий раз, когда мы используем throw внутри метода, предположим, что exception мы throwing является checked, является обязательным для добавления «кидает» в объявлении метода?

спасибо :)

+0

Google это и вы получите тысячи ссылок –

+0

вопрос, который вы ищете проверяется против непроверенных исключений – david99world

+0

Довольно обширная и интересная дискуссия по этому вопросу [здесь] [1] [1]: http://stackoverflow.com/questions/77127/when-to-throw-an-exception –

ответ

2

Любое проверяемое исключение (например, один, который не распространяется RuntimeException), которые могли бы избежать метод должен быть объявлен в сигнатуре метода. Например:

public static void mightThrow(String s) throws NumberFormatException { 
    // ... 
    int x = Integer.parseInt(s); 
    // ... 
} 

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

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

public static Integer tryParseInteger(final String s) { 
    try { 
     return Integer.parseInt(s); 
    } 
    catch (NumberFormatException ignored) { 
     return null; 
    } 
} 

В этом примере, мы всегда будем ловить любые NumberFormatException, которые могут быть брошенной Integer.parseInt() и предотвратить его кипящий стек, поэтому мы не должны объявить его в нашем tryParseInteger() методе.

Unchecked исключения никогда не должны быть объявлены:

public static void unsupported() { 
    throw new UnsupportedOperationException(
     "The specified operation is not supported." 
    ); 
} 

Здесь, поскольку UnsupportedOperationException происходит от неконтролируемого RuntimeException, он не должен быть объявлен.

+0

Это означает, что: если мы проводим наши тесты внутри метода (например, если мы проверяем условие, которое может вызвать исключение вручную (например, if (arg = 0) throw dividebyzeroexception();) нам не нужно добавлять броски dividebybzeroexce в заголовке)? – user2627156

+0

Нет, это означает, что если вы _catch_ исключение, которое выбрасывается, чтобы оно не могло всплыть в стек, тогда вам не нужно объявлять его (например, 'try {throw new Exception();} catch (Throwable) {} '). Но исключения, такие как 'ArithmeticException', расширяют' RuntimeException', поэтому даже если они избегают метода, их не нужно объявлять в подписи 'throws'. –

+0

, так что это правильно: public boolean shutdown (int a, int b) { if (a user2627156

0

Нет, так как вы можете бросить исключение, но справиться с этим в том же месте, иначе метод

0

Throws просто дайте Javac знать, что этот метод может привести к такого рода исключения. Это не всегда необходимо. Это полезно, когда вы знаете, что конкретный метод может вызывать какое-то исключение.

0

Вообще говоря, Java является строгой строгостью, поэтому вам нужно указать, какие типы исключений составляют метод throws. Обратите внимание, что вы можете использовать наследование, чтобы упростить подписи ваших методов. Например, вы можете объявить метод как throws IOException, и в его реализации бросить любой тип IOException вы хотите, такие как FileNotFoundExeption, InteruptedIOException и т.д.

Одно исключение (не каламбур) для этого правила RuntimeException s (например, OutOfMemoryError или UnsupportedOperationException), которые могут быть выброшены без объявления их.

0

Отличия:

1) Вы можете объявить несколько исключений брошенных метода в бросках ключевого слова, разделяя их в общих, например, throws IOException, ArrayIndexBoundException и т. д., в то время как вы можете бросить только один экземпляр исключения, используя ключевое слово throw, например. throw new IOException («не удается открыть соединение»).

2) ключевое слово throws дает гибкость метода при метании исключения, а не его обработке. с ключевым словом throw в методе подпишите метод, предлагающий его вызывающему пользователю подготовиться к исключению, объявленному в пункте throws, особенно в случае отмеченного исключения и обеспечить достаточную обработку их. С другой стороны, передайте управление передачей ключевого слова какому-либо вызову, бросив экземпляр Exception. бросить ключевое слово также может быть использован вместо возврата, как показано в примере ниже:

private static boolean shutdown() { 
    throw new UnsupportedOperationException("Not yet implemented"); 
} 

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

3) ключевое слово throw не может использоваться нигде в качестве исключения для метода исключения, тогда как ключевое слово throw может использоваться внутри метода или статического блока инициализатора, при условии достаточной обработки исключений, как показано в примере.

static{ 
    try { 
     throw new Exception("Not able to initialized"); 
    } catch (Exception ex) { 
     Logger.getLogger(ExceptionTest.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

4) ключевое слово throw также может использоваться для разрыва оператора switch без использования ключевого слова break.

int number = 5; 
switch(number){ 
     case 1: 
      throw new RuntimeException("Exception number 1"); 
     case 2: 
      throw new RuntimeException("Exception number 2"); 
    } 
Смежные вопросы