Бросать исключения без использования if - Java - PullRequest
0 голосов
/ 17 марта 2019

Есть ли способ вызвать исключение в вашей функции без использования оператора if в Java?Например, если целое число меньше 0, я хочу вызвать исключение, но при проверке этого конкретного условия я не хочу использовать оператор if (или switch).

Ответы [ 7 ]

6 голосов
/ 17 марта 2019

Вы можете сделать это, конечно, но почему?

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

Откуда вы знаете, что вам нужно вызвать вышеуказанный метод, не проверяя сначала условие?

2 голосов
/ 17 марта 2019

Если я восприму ваш вопрос буквально, вот ответ.Нет, если заявление, и нет переключателя.

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

}

Цитата Оскара Лопеса, из его более элегантного ответа: Но почему?

1 голос
/ 18 марта 2019

Полагаю, вы имели в виду следующее:

-Регистрация целых чисел один раз

-Брось исключение, когда одному из этих целых чисел присваивается 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);
}

(Возможно, я слишком много интерпретировал в пост, но не вижу причиныза вопрос, подобный этому, если вы не имеете в виду то, о чем я думал)

1 голос
/ 17 марта 2019

Вы можете проделать трюк с троичным оператором, однако это работает как 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 лучше, потому что вы часто хотите генерировать исключения «если» что-то не так или какое-то «условие» выполнено.

0 голосов
/ 17 марта 2019

Вы можете назначить различные типы исключений переменной, используя троичный оператор, а затем выбросить исключение.

Затем вы можете обработать случай, когда число меньше 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 голосов
/ 17 марта 2019

Есть ли способ вызвать исключение в вашей функции без использования оператора if в Java?

Да. Как правило, оператор throw не требует оператора if.

Например, если целое число меньше 0, я хочу выдать исключение

Прочитайте, что вы написали здесь очень внимательно. Поскольку вы хотите генерировать исключение только в том случае, если определенное условие истинно, вы должны использовать оператор if. Как правило, ваш код должен следовать за словами, которые вы используете для его описания.

но при проверке этого конкретного условия я не хочу использовать оператор if (или switch).

Это невозможно. Для проверки условия в Java требуется оператор if.

0 голосов
/ 17 марта 2019

Нет способа сделать это.Оператор if требуется, поскольку операторы throw не могут выполнять какую-либо логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...