抛出异常而不使用 if - Java

Throw exceptions without using if - Java

有没有办法在不使用 Java 中的 if 语句的情况下在函数中抛出异常? 例如,如果一个整数小于 0,我想抛出异常,但在检查特定条件时,我不想使用 if(or switch) 语句。

当然可以,但是为什么呢?

public static void checkNegative(int n) {
    try {
        int[] a = new int[n];
    } catch (NegativeArraySizeException e) {
        throw new IllegalArgumentException();
    }
}

如果 n < 0,上述方法将抛出一个 IllegalArgumentException(或您想要的任何其他异常),如果 0 <= n < 2^31 - 1,则什么都不做。但是可以肯定的是,在创建数组的代码中某处 是一个 if,它是隐式的。

您还可以使用 assert 来检查条件,如果已验证的表达式是 false,这将抛出 AssertionError - 只要启用断言:

assert n >= 0;

当然,您可以抛出异常 而无需 显式验证条件,但大多数时候您希望在抛出异常之前检查一些内容。

public static void throwForTheHeckOfIt() {
    throw new NumberFormatException();
}

如果不先检查条件,你怎么知道你需要调用上面的方法?

Is there a way to throw an exception in your function without using an if statement in Java?

是的。一般来说,throw语句不需要if语句。

For example, if an integer is smaller than 0, I want to throw an exception

仔细阅读您在这里写的内容。由于您只想在特定条件为真时抛出异常,因此您必须 使用 if 语句。一般来说,您的代码应该遵循您用来描述它的词语。

but when checking that specific condition, I don't want to use an if(or switch) statement.

这是不可能的。检查 Java 中的条件需要 if 语句。

如果我从字面上理解你的问题,这里有一个答案。没有 if 语句,也没有 switch。

public class NoIf {

    static void f(int x) throws Exception {
        while (x < 0) {
            throw new Exception();
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println("Trying with 1...");
        f(1);
        System.out.println("Trying with -1...");
        f(-1);
        System.out.println("Done!");
    }

}

引用 Óscar López 的更优雅的回答:但是为什么呢?

你可以用三元运算符做一个小技巧,但这就像 if 语句:

public class Task3 {
    public static void main(String[] args) throws Exception {
        someMethodReturningString(false);
    }

    private static String someMethodReturningString(boolean condition) throws Exception {
        return condition ? "true" : methodThrowingException();
    }

    private static String methodThrowingException() throws Exception {
        throw new Exception("Exception");
    } 
}

然而,这只是一个技巧。您不能在三元运算符中直接使用 throw 关键字,因为三元运算符应始终 return 一个值。但是您始终可以调用 return 需要输入三元运算符的方法。

我真的不知道你什么时候会需要这样的东西。我认为 if-else 构造是最好的,因为你经常想抛出异常 "if" 有问题或满足 "condition"。

您可以使用三元运算符将不同类型的异常分配给一个变量,然后抛出异常。

然后您可以通过捕获该特定异常并重新抛出它来处理数字小于 0 的情况。另一个异常应该有一个空捕获。

int number = 0;

RuntimeException result = number < 0 ? new NumberFormatException() : new RuntimeException();

try {
    throw result;
} catch (NumberFormatException e) {
    throw e;  
} catch (RuntimeException e) {
    // Do nothing
} 

我想你的意思是这样的:

-注册一次整数

-当其中一个整数变为 0 时抛出异常

为那个问题写了这个class:

import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

class IntegerChecker {
    private ArrayList<AtomicInteger> list = new ArrayList<>();

    IntegerChecker() {
        Thread t = new Thread(() -> {
            AtomicBoolean error = new AtomicBoolean(false);
            while (!error.get()) {
                list.forEach(integer -> {
                    if (integer.get() == 0) {
                        error.set(true);
                        throw new RuntimeException();
                    }
                });
            }
        });
        t.start();
    }

    void addInt(AtomicInteger i) {
        list.add(i);
    }
}

要测试它,请使用这个带有 JFrame 的小程序:

public static void main(String[] args) {
    AtomicInteger i = new AtomicInteger(5);

    IntegerChecker checker = new IntegerChecker();
    checker.addInt(i);

    JFrame frame = new JFrame();
    JButton button = new JButton("Click me to throw exception");
    button.addActionListener(e -> i.set(0)); //If you click the button, the integer will turn to 0 which triggers the other class
    frame.getContentPane().add(button);
    frame.pack();
    frame.setVisible(true);
}

(可能是我对 post 的解释有点太多了,但如果你的意思和我想的不一样,我看不出有什么理由问这样的问题)

Spring 框架有一个通用的简单实现:

import org.springframework.util.Assert;

Assert.isTrue(someCondition,"some condition is not true.");

实施:

public static void isTrue(boolean expression, String message) {
        if (!expression) {
            throw new IllegalArgumentException(message);
        }
}