是否有一种在Java中不使用if语句的情况下在函数中引发异常的方法? 例如,如果一个整数小于0,我想抛出一个异常,但是在检查该特定条件时,我不想使用if(或switch)语句。
答案 0 :(得分:6)
您可以做到这一点,但是为什么?
public static void checkNegative(int n) {
try {
int[] a = new int[n];
} catch (NegativeArraySizeException e) {
throw new IllegalArgumentException();
}
}
如果IllegalArgumentException
,上述方法将抛出n < 0
(或您想要的任何其他异常),而如果0 <= n < 2^31 - 1
则不执行任何操作。但是可以肯定的是,在代码中创建数组的某个地方 将是if
,它是隐式的。
此外,您还可以使用assert
来终止条件,如果已验证的表达式为AssertionError
,只要启用了断言,该条件就会抛出false
:
assert n >= 0;
当然,您可以在不显式验证条件的情况下抛出异常 ,但是大多数情况下,您都想在引发异常之前先进行检查。
public static void throwForTheHeckOfIt() {
throw new NumberFormatException();
}
您如何知道需要调用上述方法,而无需先检查条件?
答案 1 :(得分:2)
如果我从字面上理解您的问题,这是一个答案。没有if语句,也没有开关。
<div id='c'>
<div class='i'>1</div>
<div class='i'>2</div>
<div class='i'>3</div>
<div class='i'>4</div>
<div class='i'>5</div>
<div class='i'>6</div>
<div class='i'>7</div>
<div class='i'>8</div>
<div class='i'>9</div>
<div class='i'>10</div>
<div class='i'>11</div>
<div class='i'>12</div>
<div class='i'>13</div>
<div class='i'>14</div>
<div class='i'>15</div>
<div class='i'>16</div>
<div class='i'>17</div>
<div class='i'>18</div>
<div class='i'>19</div>
<div class='i'>20</div>
<div class='i'>21</div>
<div class='i'>22</div>
<div class='i'>23</div>
<div class='i'>24</div>
</div>
引用ÓscarLópez的话,他的回答更为优雅:但是为什么呢?
答案 2 :(得分:1)
您可以使用三元运算符来解决问题,但这类似于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");
}
}
但这只是一个把戏。您不能在tenary运算符中直接使用throw关键字,因为tenary运算符应始终返回一个值。但是,您始终可以在tenant运算符中调用返回所需类型的方法。
我真的不知道您什么时候需要这样的东西。我认为if-else构造是最好的,因为您经常想在“某事有误”或某个“条件”得到满足时抛出异常。
答案 3 :(得分:1)
我想你的意思是这样:
-一次注册整数
-当这些整数之一变为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);
}
}
要对其进行测试,请使用带有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);
}
(可能是我在帖子中解释得太多了,但是如果您不是我想的那样,我没有理由问这样的问题)
答案 4 :(得分:0)
是否有一种在Java中不使用if语句的情况下在函数中引发异常的方法?
是的。通常,throw
语句不需要if
语句。
例如,如果一个整数小于0,我想抛出一个异常
请仔细阅读您在此处写的内容。由于您只想在特定条件为真时才引发异常,因此您必须使用if语句。通常,您的代码应遵循用来描述它的文字。
但是在检查特定条件时,我不想使用if(或switch)语句。
这是不可能的。在Java中检查条件需要使用if
语句。
答案 5 :(得分:0)
您可以使用三元运算符将不同类型的异常分配给变量,然后引发异常。
然后,您可以通过捕获该特定异常并将其重新抛出,来处理数字小于0的情况。另一个Exception应该有一个空捕获。
int number = 0;
RuntimeException result = number < 0 ? new NumberFormatException() : new RuntimeException();
try {
throw result;
} catch (NumberFormatException e) {
throw e;
} catch (RuntimeException e) {
// Do nothing
}
答案 6 :(得分:0)
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);
}
}
答案 7 :(得分:-2)
没有办法做到。需要if语句,因为throw语句不能执行任何逻辑。