抛出异常而不使用if-Java

抛出异常而不使用if-Java,java,if-statement,exception,throw,Java,If Statement,Exception,Throw,有没有一种方法可以在不使用Java中的if语句的情况下在函数中引发异常? 例如,如果一个整数小于0,我想抛出一个异常,但在检查特定条件时,我不想使用ifor switch语句。没有办法这样做。if语句是必需的,因为throw语句不能执行任何逻辑。当然可以,但为什么 public static void checkNegative(int n) { try { int[] a = new int[n]; } catch (NegativeArraySizeExcep

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

没有办法这样做。if语句是必需的,因为throw语句不能执行任何逻辑。

当然可以,但为什么

public static void checkNegative(int n) {
    try {
        int[] a = new int[n];
    } catch (NegativeArraySizeException e) {
        throw new IllegalArgumentException();
    }
}
如果n<0,上面的方法将抛出一个IllegalArgumentException或您想要的任何其他异常,如果0,则不会执行任何操作 有没有一种方法可以在不使用Java中的if语句的情况下在函数中引发异常

对。通常,throw语句不需要if语句

例如,如果一个整数小于0,我想抛出一个异常

仔细阅读你在这里写的东西。因为您只想在特定条件为true时抛出异常,所以必须使用if语句。一般来说,您的代码应该遵循您用来描述它的词语

但在检查特定条件时,我不想使用ifor开关语句


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

如果我按照字面意思理解您的问题,下面是一个答案。没有if语句,也没有开关

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关键字,因为十进制运算符应始终返回值。但您始终可以在十进制运算符中调用返回所需类型的方法


我真的不知道你什么时候会需要这样的东西。我认为if-else构造是最好的,因为如果出现错误或满足某些条件,您通常希望抛出异常。

您可以使用三元运算符为变量指定不同类型的异常,然后抛出异常

public static void throwForTheHeckOfIt() {
    throw new NumberFormatException();
}
然后,您可以通过捕获特定异常并重新抛出它来处理数字小于0的情况。另一个异常应该有一个空的catch

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时引发异常

为此问题编写了此类:

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);
    }
}

可能是我在文章中解释得太多了,但如果你不是我想的那样问这样的问题,我看不出有什么理由问这样的问题。

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

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);
        }
}

为什么?这是一个非常谨慎的要求,没有任何实际理由。在你告诉你不想使用if语句的同一句话中,你暗示要使用一个:当检查特定条件时。。。这需要一个if语句,不是吗?你可以做类似的事情并断言一些变量状态。你可以使用三元运算符。或者一个谓词,如果您使用的是java 8+,如果我理解正确,您直接希望在整数小于0时抛出一个异常,而无需使用额外的代码检查整数的运行位置。那真的不可能。我想你唯一能做的就是在一个额外的线程中注册所有的整数,然后在这个线程中用whiletrue循环中的if语句检查它们。这是不正确的。正如几个答案所证明的那样,这是可以做到的,尽管这似乎毫无意义。不,如果捕获NegativeArraySizeException并在catch块中抛出所需的任意异常,则不能以这种方式抛出任意异常。@Andreas你当然是对的!我更新了我的答案。如果n>=0,我将什么也不做。。。当然,除非n足够大,VM无法分配array@CupawnTae这是一个很好的捕获:。我很惊讶人们是如何做出巨大的努力来完美地回答这样一个问题。。。荒谬的问题!我喜欢这样-它处理的数字比新的int[n]大,可以适应非int,并且不需要启用断言。幸运的是,您不能从Java中的三元语句引发异常。这行不通这行不通,我刚编译好。您不能像下面这样显式地抛出它:条件?true:抛出新异常;这就是为什么我使用一个技巧来创建一个返回值并抛出异常的方法。我也在我的回答中写到了。啊,我明白了。对不起,我的孩子,谢谢你!这是我所需要的最接近的解决方案@MariaPascu三元运算符只是IF的不同语法,它还检查布尔条件,唯一的区别是它返回一个值。也许下一次,如果你能在问题中解释为什么你需要你所问的东西,这会很有帮助。
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);
        }
}