关于抛出IllegalArgumentException

时间:2014-04-09 03:18:02

标签: java

我是Exceptions的新手,这是我目前所知道的:

  • 投掷和投掷是不同的

  • 执行'抛出IllegalArgumentException'我可能不得不添加'抛出IllegalArgumentException'方法签名

  • IllegalArgument异常是未经检查的异常,并且"在编译时未处理其处理的异常

来源:http://javarevisited.blogspot.com/2011/12/checked-vs-unchecked-exception-in-java.html#ixzz2yM5jNFeghttp://www.tutorialspoint.com/java/java_exceptions.htm

这是一个功课问题:抛出IllegalArgumentException会让程序立即退出吗?

这个问题似乎有点笼统,很可能是错误的,但我也不完全清楚IllegalArgumentException。消息来源并没有真正举例说明' throw'以一种简单的方式,所以我仍然感到困惑。如果可以对此进行简单的解释,那将会很棒。

2 个答案:

答案 0 :(得分:2)

未捕获的异常可以使单线程应用程序退出。如果您将下面的foo / bar示例放入Java应用程序中,您将看到执行状态将因未捕获的异常而终止。

抛出与抛出之间的区别抛

/**
 * This is my foo method
 * @throws IllegalArgumentException if argument is wrong!
 */
public void foo(String s) throws IllegalArgumentException {
    // Some code
    if (!s.equals("bar")) {
        throw IllegalArgumentException("something not quite right here...");
    }
}

你快到了 - @throws用于注释的文档目的以及在方法签名中用于指示可能抛出的方法可能存在的任何异常。这包括直接或间接抛出的异常。添加任何可以从它从相同或其他对象/类中使用的任何方法抛出的链接或者不会捕获的抛出总是很好。

Throw是实现代码。当您尝试在运行时向方法发送错误的类参数时,通常会抛出IllegalArgumentException。如上所示,您也可以在检查失败时手动抛出它们。

此外,您不需要在方法签名中声明它,但是如果您确实声明了它,那么您拥有的任何实现代码都应该包含在try / catch块中。

间接例外的一个例子:

class foo {
    /**
     * @throws IllegalArgumentException when s != foo
     */
    public void foo(String s) throws IllegalArgumentException {
        if (!s.equals("foo")) {
            throws IllegalArgumentException("argument did not equal 'foo'");
        }
    }
}

class bar {
    protected foo foo;
    public bar() {
        this.foo = new foo();
    }

    public void bar(String s) throws IllegalArgumentException {
        this.foo.foo(s);
    }
}

答案 1 :(得分:2)

抛出任何异常会使当前的方法立即退出,但不会退出整个程序。此外,异常将继续被抛出调用方法,从第一种方法抛出它;这称为传播。它是否继续在那一点取决于该调用方法是否捕获异常。如果没有捕获异常,它将一直传播回main方法(假设是一个简单的单线程应用程序),如果该方法也抛出它,那么然后程序将退出。

void callee() {
    if (someTrueCondition()) {
        throw new IllegalArgumentException("whatever");
    }
    System.out.println("this will never get called");
}

void caller() {
    calle(); // the IllegalArgumentException propagates from here
    System.out.println("this will also never get called");
}

任何例外情况都是如此。使IllegalArgumentException与其他人不同的原因只是它未经检查,因此不需要在可能抛出它的方法的throws子句中声明。 (请注意,在您的问题中,您说您可能需要声明throws IllegalArgumentException,但实际上并非如此,因为它是未经检查的异常。)

如果你反而抛出一个经过检查的例外(例如throw new SQLException()),那么 calleecaller都需要声明该异常。 callee需要声明它,因为它会直接抛出该异常,并且caller需要声明它,因为它可能通过callee的传播间接抛出该异常。

停止此传播的唯一方法(运行时的异常和编译时的throws子句)是用try-catch捕获给定的异常。