对我来说,这些代码
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
的一些好例子。非常感谢你!
答案 0 :(得分:9)
由于ArithmeticException
是unchecked 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
是其子类。