5

对我来说,这些代码

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

4 回答 4

9

由于ArithmeticException未经检查的异常,因此在throws规范中列出它对编译器而言没有任何影响。

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

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

于 2013-04-01T14:01:04.903 回答
3

上面的方法签名使用表达式throws ArithmeticException告诉此函数的用户该方法可能会引发此异常,他们应该知道并捕获它(如果他们想要 - “想要”只是因为这个异常没有被检查 - 并计划一个解决方法)案子)。

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

于 2013-04-01T14:03:49.913 回答
3

除了beeing 所说的,我发现还有一个好处可以帮助我编写代码。

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 blockinside 方法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();
    }
}

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

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 中的 throws 可能更重要:)

void Test.baz() throws IllegalArgumentException
于 2013-04-01T14:20:06.017 回答
1

由于 Java 没有提供简单的 True/False 标志来确定给定的异常是已检查还是未检查,所以您需要了解您(作为程序员)必须处理哪些类型的异常(捕获或重新抛出)和您可以选择不处理(实际上忽略)。

特别是,整个RunTimeException类是未经检查的,并且ArithmeticException是它的子类。

于 2013-04-01T14:12:53.470 回答