为什么我不能使用抛出 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 JavaRuntimeException 只有当错误是程序错误时才应该抛出(意思是程序员犯了错误而编写代码,并传递了一些无效的输入)。

一般来说,只有当程序无法从发生的错误中恢复时才应该抛出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块中来处理那个异常。