是否可以将例外用作条件?

时间:2018-01-02 14:18:48

标签: java exception conditional-statements

所以这里是我的应用程序中的一些代码:

public void run() throws myException{
    boolean gameOver = false;
    while(!gameOver){
        //do stuff, and eventually make gameOver true to end execution
...

现在是交易,我想删除布尔属性以使用用户定义的异常来结束执行。 我正在考虑检查是否在while条件下抛出了这个异常,只要它已经抛出 not 就保持循环。

的内容
while(myException.notThrown){

可以这样做吗?

5 个答案:

答案 0 :(得分:3)

您的问题的答案是,但这种结构的实施取决于您的需求。

直接(和不恰当的)方式是:

public void run() {
    MyException ex = null;
    while(ex == null) {
        try {
            // Do stuff
        } catch(MyException e) {
            // Maybe handle this exception
            ex = e;
        }
    }
}

但这是一种奇怪的逻辑形式,可以简化为:

public void run() {
    while(true) {
        try {
            // Do stuff
        } catch(MyException e) {
            // Maybe handle this exception
            break;
        }
    }
}

或者这是我对这三者的偏好:

public void run() {
    try {
        while(true) {
            // Do stuff
        } 
    } catch(MyException e) {
       // Maybe handle this exception
    }
}

尽管存在所有这些可能性,因为您的throws MyException签名中已经有run,假设您的来电者正确处理它,您可以这样做:

public void run() throws MyException {
    while(true) { // Or maybe some exit condition?
        try {
            // Do stuff
        }
    }
}

这使异常传播给调用者。然后,让调用者处理结果异常:

try {
    myObject.run();
} catch(MyException e) {
    // Handle this exception
}

您想要使用的结构取决于您的逻辑流程。考虑哪个实体应该处理您的自定义异常。抛出此异常是什么意思?谁/什么负责处理这种情况?

答案 1 :(得分:2)

但为什么呢?如果你真的需要它,你可以做一个无限循环来做,你可以做那样的事情

while (true) {
    try {
        // some code to throw an exception
    } catch(Exception e) {
        e.printStackTrace();
        break;
    }
}

UPDATE 您可以将内部循环变为异常

try {
    while (true) {
        // some code to throw an exception in order to remove the break keyword
    }
} catch (Exception e) {
    e.printStackTrace();
}

答案 2 :(得分:0)

你可以和休息时间一起玩。如果发生异常,你会打破这段时间。

while (true) {
    try {
        ...
    } catch (YourException e) {
        break;
    }
}

答案 3 :(得分:0)

可以这样做吗?

是的,你可以这样做:

public class Example {
    public static void run() throws IOException {
        if (Math.random() > 0.75) {
            throw new IOException();
        }
    }
    public static void main(final String... args) {
        boolean thrown = false;
        while (!thrown) {
            System.out.println("Roll");
            try {
                run();
            } catch (IOException ex) {
                thrown = true;
            }
        }
        System.out.println("Done");
    }
}

在示例卷上将输出:

Roll
Roll
Roll
Roll
Roll
Done

应该这样做

这可能是一个糟糕的想法,因为它会使代码更难阅读,更难维护,抛出异常的开销也可能使代码变慢。

答案 4 :(得分:0)

是的,有可能。 但是使用flow control is generally considered an anti-pattern的例外;它使得更难以阅读和调试代码。