为什么我不能使用抛出 catch 块的方法?为什么一般使用try/catch throw/throws?
Why cant I use a method that throws in a catch block? Why use try/catch throw/throws in general?
这就是例子。 Taschenrechner 仅表示计算器。
这是主要的class:
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
try {
Taschenrechner.divide(num1,num2);
}
catch (Exception e) {
System.out.println("Wrong entry repeat your entry");
num1 = sc.nextInt();
num2 = sc.nextInt();
try {
Taschenrechner.divide(num1,num2);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
这是采用 class 方法的 Taschenrechner class:
public static void divide(int userZahl1, int userZahl2) throws Exception {
if(userZahl2 == 0) {
throw new Exception();
}
else {
System.out.println("Ergebnis : " + (userZahl1/userZahl2));
}
}
}
我不明白的是为什么我必须将第二个 Taschenrechner.divide() 方法包装在另一个 try/catch 块中的 catch 块中?
总的来说,我不太明白为什么我使用throw/throws并试图抓住Java?
它真的比
这样的 if 子句更有效地处理错误吗
if(userEntry == 0 ){ System.out.println("Wrong entry. Try again!"); } ?
首先,重要的是要了解有两种类型的异常:
- 已检查异常
- 未经检查的异常
其中后一个是所有继承自 RuntimeException
的异常,您不应在方法签名中为它们声明 throws
。
根据书 Hardcore Java,RuntimeException
只有当错误是程序错误时才应该抛出(意思是程序员犯了错误而编写代码,并传递了一些无效的输入)。
一般来说,只有当程序无法从发生的错误中恢复时才应该抛出RuntimeException
。如果我们真的能解决这个错误,我们会用 try-catch
块包裹它并从中恢复。
具体到您的问题,第一次调用 Taschenrechner.divide(num1,num2);
可能会抛出已检查的异常(来自类型 Exception
),因此调用此函数的任何人都必须在调用 [= 时执行以下操作之一17=]
- 用
try-catch
块 结束调用
- 在您的方法签名上声明
throws
并让调用者
此方法处理异常
至于关于效率的问题 - 请记住,有时您编写代码供其他人使用。假设这个人将错误的输入传递到您的代码中——您如何向这个人传达发生了不好的事情而无一例外? (或旧语言错误代码...)
您可以在此处了解 checked/unchecked 异常示例:https://howtodoinjava.com/java/exception-handling/checked-vs-unchecked-exceptions-in-java/
如果 userZahl2 为 null 而不是 0 怎么办。它会再次引发异常。是的,就您而言,您可以轻松管理这些事情,但有时事情比看起来要复杂得多。所以在写程序的时候,如果我们认为程序中的某些语句可以抛出异常,我们大多将它们封装在try块中来处理那个异常。
这就是例子。 Taschenrechner 仅表示计算器。
这是主要的class:
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
try {
Taschenrechner.divide(num1,num2);
}
catch (Exception e) {
System.out.println("Wrong entry repeat your entry");
num1 = sc.nextInt();
num2 = sc.nextInt();
try {
Taschenrechner.divide(num1,num2);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
这是采用 class 方法的 Taschenrechner class:
public static void divide(int userZahl1, int userZahl2) throws Exception {
if(userZahl2 == 0) {
throw new Exception();
}
else {
System.out.println("Ergebnis : " + (userZahl1/userZahl2));
}
}
}
我不明白的是为什么我必须将第二个 Taschenrechner.divide() 方法包装在另一个 try/catch 块中的 catch 块中?
总的来说,我不太明白为什么我使用throw/throws并试图抓住Java?
它真的比
这样的 if 子句更有效地处理错误吗 if(userEntry == 0 ){ System.out.println("Wrong entry. Try again!"); } ?
首先,重要的是要了解有两种类型的异常:
- 已检查异常
- 未经检查的异常
其中后一个是所有继承自 RuntimeException
的异常,您不应在方法签名中为它们声明 throws
。
根据书 Hardcore Java,RuntimeException
只有当错误是程序错误时才应该抛出(意思是程序员犯了错误而编写代码,并传递了一些无效的输入)。
一般来说,只有当程序无法从发生的错误中恢复时才应该抛出RuntimeException
。如果我们真的能解决这个错误,我们会用 try-catch
块包裹它并从中恢复。
具体到您的问题,第一次调用 Taschenrechner.divide(num1,num2);
可能会抛出已检查的异常(来自类型 Exception
),因此调用此函数的任何人都必须在调用 [= 时执行以下操作之一17=]
- 用
try-catch
块 结束调用
- 在您的方法签名上声明
throws
并让调用者 此方法处理异常
至于关于效率的问题 - 请记住,有时您编写代码供其他人使用。假设这个人将错误的输入传递到您的代码中——您如何向这个人传达发生了不好的事情而无一例外? (或旧语言错误代码...)
您可以在此处了解 checked/unchecked 异常示例:https://howtodoinjava.com/java/exception-handling/checked-vs-unchecked-exceptions-in-java/
如果 userZahl2 为 null 而不是 0 怎么办。它会再次引发异常。是的,就您而言,您可以轻松管理这些事情,但有时事情比看起来要复杂得多。所以在写程序的时候,如果我们认为程序中的某些语句可以抛出异常,我们大多将它们封装在try块中来处理那个异常。