抛出异常而不使用if-Java
有没有一种方法可以在不使用Java中的if语句的情况下在函数中引发异常?抛出异常而不使用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
例如,如果一个整数小于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);
}
}