2010-01-01 2 views
20

когда вы делаете это:Броски ключевое слово для исключений в Java

public class Blah { 

    public void doBlah() throws BlahException { 

    } 

} 

Что Складывая throws BlahException реально сделать?

Содержит ли это в основном любое исключение из этого? то есть, если есть исключение, независимо от того, что это такое, всегда будут выбрасываться с использованием BlahException?

ответ

20

Он сообщает клиентам вашего класса, что метод DoBlah может вызывать исключение BlahException или любое другое исключение, которое расширяет его..

Если это проверенное исключение, компилятор потребует, чтобы они переносили вызовы этого метода в блок try/catch. Если он не установлен, они могут отказаться от исключения, но им нужно знать, что если они этого не сделают, он будет пузыряться дальше в стеке вызовов.

В нем ничего не говорится об исключенных исключениях, таких как NullPointException или ошибки. Их всегда можно бросить. Они не требуются в предложении бросков.

Этот код показывает, как это работает:

ExceptionDemo.java:

package exceptions; 

public class ExceptionDemo 
{ 
    public static void main(String[] args) 
    { 
     ExceptionDemo demo = new ExceptionDemo(); 

     try 
     { 
      // Removing the try/catch will result in a compilation error 
      demo.doChecked();    
     } 
     catch (CheckedException e) 
     { 
      e.printStackTrace(); 
     } 

     // Note: Not inside a try/catch, in spite of the throws clause 
     demo.doUnchecked(); 
    } 

    public void doChecked() throws CheckedException 
    { 
     System.out.println("doing something that may throw a checked exception"); 
    } 

    // Note: "throws" clause is unnecessary for an unchecked exception 
    public void doUnchecked() throws UncheckedException 
    { 
     System.out.println("doing something that may throw an unchecked exception"); 
    } 
} 

CheckedException.java:

package exceptions; 

public class CheckedException extends Exception 
{ 
    public CheckedException() 
    { 
     super(); 
    } 

    public CheckedException(String message) 
    { 
     super(message); 
    } 

    public CheckedException(String message, Throwable cause) 
    { 
     super(message, cause); 
    } 

    public CheckedException(Throwable cause) 
    { 
     super(cause); 
    } 
} 

UncheckedException.java:

package exceptions; 

public class UncheckedException extends RuntimeException 
{ 
    public UncheckedException() 
    { 
     super(); 
    } 

    public UncheckedException(String message) 
    { 
     super(message); 
    } 

    public UncheckedException(String message, Throwable cause) 
    { 
     super(message, cause); 
    } 

    public UncheckedException(Throwable cause) 
    { 
     super(cause); 
    } 
} 
+1

Необычно, нет никаких упоминаний о том, что я могу найти Исключения в учебнике Java (http://java.sun.com/docs/books/tutorial/java/TOC.html). Какое своеобразное упущение. – skaffman

+0

Как раз для моего любопытства, как именно вы указываете, нужно ли проверять или отменять (определяемое пользователем) исключение? Это так же просто, как заставить его появляться в этом разделе «бросает», или есть что-то, что вам нужно сделать в самом классе исключения? –

+2

@skaffman Исключения охватываются основными классами Java (http://java.sun.com/docs/books/tutorial/essential/index.html), а не изучением Java-языка. – mikej

13

No. T он throws BlahException указывает компилятору, что ваша функция может выдать исключение BlahException и что это должно быть уловлено вызывающим. Например:

class ExceptionThrower 
{ 
    void someFunction() 
    { 
     for(int i =0; i<10;i++) 
      if(i==4) throw new Exception(); 
    } 

    public static void main(String args[]) 
    { 
     new ExceptionThrower().someFunction(); 
    } 
} 

Эта программа не компилируется, потому что он может выбросить исключение типа Exception, и исключение не было ни поймано, ни заявляемого быть выброшено.

Однако следующий код будет скомпилирован.

class ExceptionThrower 
{ 
    void someFunction() throws Exception 
    { 
     for(int i =0; i<10;i++) 
      if(i==4) throw new Exception(); 
    } 

    public static void main(String args[]) 
    { 
     try 
     { 
      new ExceptionThrower().someFunction(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 
} 

По существу, вы сообщаете компилятору, что эта функция может сгенерирует исключение, которое не обрабатывается внутри самой функции. Этими исключениями являются все подклассы java.lang.Exception и называются проверенными исключениями. Другие исключения, которые указывают на катастрофический сбой, вызванный ошибками в самой программе, а не условием, например неправильным вводом, являются подклассы java.lang.RuntimeException, и они называются исключенными исключениями. Короче говоря, необработанные исключения могут быть брошены без предложения throws в сигнатуре метода, в то время как любые проверенные исключения должны указываться там.

Для обсуждения проверенных версийнепроверенные исключения см http://www.javapractices.com/topic/TopicAction.do?Id=129

+3

Это неверно для исключенных исключений. Они могут быть объявлены в сигнатуре метода по причинам, связанным с документацией, но не должны быть пойманы клиентами. –

1

Ваш метод doBlah() необходимость иметь что-то, что может throwBlahException или любой подкласс BlahException. Это говорит о вызывающем абоненте doBlah(), чтобы быть осторожным, чтобы обернуть код в try-catch.

2

Идея состоит в том, что без ключевого слова throws исключение, вызванное методом, невозможно обработать вне метода.

Разве это не так?

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