2014-04-09 34 views
1

我是新来的例外,这是我所知道的,到目前为止:关于投掷抛出:IllegalArgumentException

  • 投和罚球都不同

  • 做“抛出IllegalArgumentException”我可能会增加'抛出IllegalArgumentException'方法签名

  • 非法参数异常是一个未经检查的异常和“处理未在编译期间验证的异常

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

这是一个家庭作业的问题:不抛抛出:IllegalArgumentException使程序立即退出?

这个问题似乎有点普遍,可能是错误的,但我并不完全清楚IllegalArgumentException。这些消息并没有以一种简单的方式真正体现“抛出”,所以我仍然感到困惑。所以,如果能够对此进行简单的解释,那将是非常好的。

+0

如果您调用一个需要特定输入但您不服从的方法,则可能会抛出IllegalArgumentException。如果任何异常未被捕获,您的程序将结束。如果它被任何人抓住了调用堆栈,那么捕获器就如何处理它。因此,如果您预计您的调用可能导致IllegalArgumentException,那么您可以通过两种方式处理它。 1)在打电话之前亲自检查变量以确保它们良好。 2)用try块包围你的调用并捕获IllegalArgumentException并在发生时做适当的事情。 –

+0

有两种类型的例外。 “检查异常”和“运行时异常”。如果该方法抛出检查的异常,则只需在方法签名中声明'throws'子句。对于运行时异常(即IllegalArgumentException),您不需要在方法签名中声明throws子句。抛出异常不会立即退出程序。您可以选择捕捉并处理该异常。 – anonymous

+0

@stvcisco我只是假设我打电话'抛出IllegalArgumentException',而不是做一个try-catch块。这是否会退出当前的方法?甚至整个计划?我想不是,对吧? – user3511965

回答

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,但实际上你不这样做,因为它是一个unchecked异常)。

如果你是不是抛出检查异常(例如,throw new SQLException()),然后calleecaller将需要声明该异常。 callee需要声明它,因为它直接抛出异常,并且caller需要声明它,因为它可能通过callee的传播间接抛出该异常。

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

+0

如果只有一个主要功能,我们称之为声明怎么办?它会导致程序退出吗? – user3511965

+0

是的;如果'main'抛出一个异常,程序将暂停(再次假设一个单线程应用程序)。 – yshavit

+0

停止等于停止吗?你认为是否导致程序立即退出的问题太广泛而普遍? – user3511965

1

未捕获的异常可以使单线程应用程序退出。如果您将下面的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..."); 
    } 
} 

之间抛出&掷

就快成功了 - 抛出:是文档的目的在评论以及使用方法签名表示任何可能出现的异常的方法 威力抛出。这包括直接或间接抛出的异常。添加任何它被链接或无法捕获的抛出总是很好,它可以从任何使用相同或其他对象/类的方法抛出。

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

我不认为OP为了文档目的询问'@ throws'。在方法签名中需要'throws'子句的情况是该方法抛出一个'checked exception'。尝试抛出新的IOException(“”)'没有throws子句,你会看到问题。 – anonymous

+0

不太...抛出规范,而不是评论。 – djechlin

+0

我不好,根据那个更正了答案 –

相关问题