不使用if抛出异常-Java

时间:2019-03-17 20:08:15

标签: java if-statement exception throw

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

8 个答案:

答案 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语句不能执行任何逻辑。