使用关键字throws来声明抛出运行时异常

时间:2013-04-01 13:59:52

标签: java exception-handling

对我来说,这些代码

static int faktorial (int n) throws ArithmeticException {
  if ((n < 0) || (n > 31)) { 
    throw new ArithmeticException();
  } 
  if (n > 1) {
    return n * faktorial(n - 1);
  } 
  else {
    return 1;
  }    
}

和没有

的相同代码
throws ArithmeticException

在我使用以下代码时也这样做:

public static void main(String[] args) {
  try {
    int n;
    Scanner sc = new Scanner(System.in);  

    System.out.print("Insert integer number: ");        
    n = sc.nextInt();         
    System.out.println(n + "! = " + faktorial(n));
  }
  catch (InputMismatchException e) {
    System.out.println("Not an integer number!");
    e. printStackTrace();
  }
  catch (RuntimeException e) {
    System.out.println("Number is too big!");
    e. printStackTrace();
  }
}

如果使用

,有人可以形容我
    throws ArithmeticException

在我的代码中有一些优势。

我也会感谢使用关键字throws的一些好例子。非常感谢你!

4 个答案:

答案 0 :(得分:9)

由于ArithmeticExceptionunchecked exception,因此在throws规范中列出它对编译器而言没有任何影响。

尽管如此,我认为保留throws规范是出于文档目的的好主意。

也就是说,当使用无效参数调用函数时,ArithmeticException可能不是正确的异常。使用IllegalArgumentException会更合适。

答案 1 :(得分:3)

上述方法签名使用表达式throws ArithmeticException来表示 该函数的用户该方法可能抛出此异常,它们应该是 意识到并抓住它(如果他们想要 - “想要”只是因为这个例外是未经检查的 - 并在这种情况下计划一个变通方法。)

除非ArithmeticException不是在这种情况下使用的正确例外(您可以在技术上使用它们中的任何一个)。抛出的一个更好的例外是IllegalArgumentException,因为它暗示传入的参数是不正确的。

答案 2 :(得分:3)

除了正在说的内容之外,我发现有一个好处可以帮助我编码。

Eclipse可以使用该信息(该方法使用throws RuntimeException声明)和(按需)添加正确的 catch子句。

让我们看看这个:

public static void main(String[] args) {
    test();
}

private static void test() {
    foo();
    bar();
    baz();
}

public static void foo() {

}

public static void bar() throws NullPointerException {

}

public static void baz() throws IllegalArgumentException {

}

在方法try/ catch block中添加test将导致:

private static void test() {
    try {
        foo();
        bar();
        baz();
    } catch (NullPointerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

那很好,不是吗?但是,它仅适用于第一级方法调用,因此它不会因多次捕获运行时异常而污染更高级别的抽象:

public static void main(String[] args) {
    try {
        test();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static void test() {
    foo();
    bar();
    baz();
}

那也很好。

无论如何,看到javadoc中的抛出可能更为重要:)

void Test.baz() throws IllegalArgumentException

答案 3 :(得分:1)

由于Java没有提供简单的True / False标志来确定给定的异常是否为checked or unchecked,因此您需要了解您(作为程序员)必须处理的异常类型(catch或者你可以选择不处理(有效忽略)。

特别是,整个RunTimeException类未选中,ArithmeticException是其子类。