Java Try Catch块工作,但test assertThrows失败(Junit 5)

Java Try Catch块工作,但test assertThrows失败(Junit 5),java,junit5,Java,Junit5,我正在努力学习本教程 我使用Java 10、IntelliJ 2018和Junit 5 我制作了一个计算器应用程序,可以添加2个分数。它检查输入的分母中是否有0 当我运行测试时,异常消息被打印出未定义的数学表达式,但是我的IDE说应该抛出java.lang.Throwable,但是没有抛出任何内容。我认为我的代码范围有问题?我是个新手,请善待我。我提供了以下代码和测试: public class Calculator { public static int[] calculate (in

我正在努力学习本教程

我使用Java 10、IntelliJ 2018和Junit 5

我制作了一个计算器应用程序,可以添加2个分数。它检查输入的分母中是否有0

当我运行测试时,异常消息被打印出未定义的数学表达式,但是我的IDE说应该抛出java.lang.Throwable,但是没有抛出任何内容。我认为我的代码范围有问题?我是个新手,请善待我。我提供了以下代码和测试:

public class Calculator {
    public static int[] calculate (int firstNumerator, int firstDenominator, int secondNumerator, int secondDenominator) {

        String exceptionMessage = "Undefined Math Expression";
        int resultNumerator;
        int resultDenominator;
        int[] result = new int[2];

        resultNumerator =  (firstNumerator * secondDenominator) +
                (secondNumerator * firstDenominator);
        resultDenominator = firstDenominator * secondDenominator;

        try {
            if (resultDenominator == 0) {
                  throw (new Throwable(exceptionMessage));
            } else {
                result[0] = resultNumerator;
                result[1] = resultDenominator;
            }
        } catch (Throwable e) {
           System.out.println(e.getMessage());
        }

        return result;
    }
}
测试:

class CalculatorTest {
    @Test
    void denominatorContainsZero() {
        assertThrows(Throwable.class, () -> {
            Calculator.calculate(0,0,0,0);
        });
    }
}

try-catch块捕获了可丢弃的内容,因此Junit无法访问它。尝试删除Try-catch块。

Try-catch块捕获了可丢弃文件,因此Junit无法访问它。尝试删除Try-catch块。

您实际上不是在抛出异常,而是在捕获它。要使其工作,您应该删除try-catch块。

您实际上不是在抛出异常,而是在捕获它。要使其正常工作,您应该删除try-catch块。

这里的误解似乎是JUnit实际看到的

JUnit并不神奇:它只是简单的旧Java。它看不到你的方法的内部,也看不到它们在做什么。它所能看到的是任何其他代码在执行方法时所能看到的:返回值和未捕获的异常,以及方法的任何副作用,如果它们对调用代码可见的话

这里的方法不会从调用方的角度抛出异常:在内部,它抛出异常,但它捕获并处理异常

如果希望JUnit测试是否抛出异常,则不需要捕获该异常

抛出异常,然后自己捕获并处理它,这永远都不是正确的做法。重点是什么?您可以简单地执行处理它所做的事情,而不抛出异常。由于需要捕获整个堆栈跟踪,抛出异常的代价很高

抛弃永远不是一个正确的例外。它相当于返回对象的异常:它不向调用者传递有关异常的类型信息,调用者或者需要做大量工作来处理它;或者,更现实地说,应该自己传播。IllegalArgumentException是在这里抛出的正确异常,如果您实际上需要抛出而不是捕获异常

可丢弃的东西很少是合适的。Throwable是异常和错误的超类型,因此您可能会无意中捕获错误,例如OutOfMemoryError,不应该捕获它,因为除了使程序崩溃之外,没有什么合理的方法可以做。抓住你能抓住的最具体的类型;这也意味着您应该抛出您可以抛出的最具体的类型,或者至少抛出适合于抽象的类型


*这永远不会像ok一样,在有限的情况下可能是合适的。但是,除非你明白这些是什么,否则不要这样做。

这里的误解似乎是JUnit所能看到的

JUnit并不神奇:它只是简单的旧Java。它看不到你的方法的内部,也看不到它们在做什么。它所能看到的是任何其他代码在执行方法时所能看到的:返回值和未捕获的异常,以及方法的任何副作用,如果它们对调用代码可见的话

这里的方法不会从调用方的角度抛出异常:在内部,它抛出异常,但它捕获并处理异常

如果希望JUnit测试是否抛出异常,则不需要捕获该异常

抛出异常,然后自己捕获并处理它,这永远都不是正确的做法。重点是什么?您可以简单地执行处理它所做的事情,而不抛出异常。由于需要捕获整个堆栈跟踪,抛出异常的代价很高

抛弃永远不是一个正确的例外。它相当于返回对象的异常:它不向调用者传递有关异常的类型信息,调用者或者需要做大量工作来处理它;或者,更现实地说,应该自己传播。IllegalArgumentException是在这里抛出的正确异常,如果您实际上需要抛出而不是捕获异常

可丢弃的东西很少是合适的。Throwable是异常和错误的超类型,因此您可能会无意中捕获错误,例如OutOfMemoryError,不应该捕获它,因为除了使程序崩溃之外,没有什么合理的方法可以做。抓住你能抓住的最具体的类型;这也意味着您应该抛出您可以抛出的最具体的类型,或者至少抛出适合于抽象的类型

*这永远不会像ok一样,在有限的情况下可能是合适的。但是,除非你明白这些是什么,否则就不要这样做。

你应该很少抓住一次性垃圾;实际上,你不应该扔垃圾
可划船。在这种情况下,例外是完全没有必要的:只需打印消息;实际上,你不应该扔掉一次性垃圾。在这种情况下,异常是完全不必要的:只需打印消息即可。我试图删除:catch Throwable e{System.out.printlne.getMessage;},但系统显示未处理的异常。系统迫使我去处理它。如何让函数在不处理异常的情况下抛出异常?解决方法可能是将方法签名更改为公共静态int[]calculate int firstNumerator、int firstDenominator、int secondNumerator、int secondDenominator抛出Throwable@user3270418但是,我不建议使用一次性的。您可能想使用IllegalArgumentException。我试图将throws Throwable添加到我的方法签名中,但它仍然希望我捕获它o_o。它显示错误:15,63 java:unreported exception java.lang.Throwable;必须捕获或声明为thrownI试图删除:catch Throwable e{System.out.printlne.getMessage;},但系统显示未处理的异常。系统迫使我去处理它。如何让函数在不处理异常的情况下抛出异常?解决方法可能是将方法签名更改为公共静态int[]calculate int firstNumerator、int firstDenominator、int secondNumerator、int secondDenominator抛出Throwable@user3270418但是,我不建议使用一次性的。您可能想使用IllegalArgumentException。我试图将throws Throwable添加到我的方法签名中,但它仍然希望我捕获它o_o。它显示错误:15,63 java:unreported exception java.lang.Throwable;必须捕获或声明为Thrown我正试图捕获它,先生,但它迫使我捕获它,即使我在我的方法签名中添加了Thrownable。它仍然希望我捕获。@user3270418这是因为您正在抛出一个选中的异常。如果抛出未经检查的异常,如IllegalArgumentException,则不需要声明抛出。@Andy Turner好的,先生,您的意思是同时删除try和catch,然后将Throwable更改为IllegalArgumentException。它现在抛出异常。但需要同时删除尝试和捕获。总之,如果要尝试,就需要捕获,对吗?@user3270418删除尝试,删除捕获,然后抛出新的IllegalArgumentExceptionwhateverMessage;。先生,我正试图这么做,但它迫使我抓住它,即使我在我的方法签名中添加了throws-Throwable。它仍然希望我捕获。@user3270418这是因为您正在抛出一个选中的异常。如果抛出未经检查的异常,如IllegalArgumentException,则不需要声明抛出。@Andy Turner好的,先生,您的意思是同时删除try和catch,然后将Throwable更改为IllegalArgumentException。它现在抛出异常。但需要同时删除尝试和捕获。总之,如果要尝试,就需要捕获,对吗?@user3270418删除尝试,删除捕获,然后抛出新的IllegalArgumentExceptionwhateverMessage;。