抛出异常而不使用 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);
}
}
有没有办法在不使用 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);
}
}