繁体   English   中英

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

[英]using keyword throws to declare throwing of Runtime Exceptions

对我来说,这些代码

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好例子。 非常感谢你!

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

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

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

上面的方法签名使用表达式throws ArithmeticException来告诉用户该函数该方法可能抛出此异常,并且他们应该知道并捕获它(如果他们想要 - “只需”因为未检查此异常 - 并计划一个变通方法在这种情况下)。

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

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

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 {

}

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM