Java中抛出异常的高级概述

时间:2013-09-19 18:38:21

标签: java exception-handling

我对Java中的异常以及何时使用哪种特定的实现方式感到困惑。

我使用IllegalArgumentException作为示例,但我想解决的主要问题是何时抛出,扩展或抛出新异常?

另外作为一个附加点,我有一个赋值,我必须创建一个java类,并且spec隐约地声明构造函数应该抛出一个IllegalArgumentException,以便最好使用哪一个?

public class Test{

    //when does one use this type of exception
    public Test(String yourName) throws IllegalArgumentException{
      //code implemented
    }

    //when does one use this type of exception
    public Test(String yourName) extends IllegalArgumentException{
      //code implemented
    }

    public Test(String yourName){

         if(yourName.length() <= 0){
             //why not use this type of exception instead 
             //and what happens when I use this type of exception
             throw new IllegalArgumentException("Please Enter Your Name..!");
         }
    }

}

提前致谢。

3 个答案:

答案 0 :(得分:1)

当发生某些异常时,您有两种处理方式:从方法执行抛出或执行 try-catch 。第一个看起来像这样:

public class MyClass {
    public void myMethod() throws IllegalArgumentException {
        someOtherMethod();
    }
}

在这种情况下,您知道someOtherMethod()可以抛出异常并且您不想处理它 - 您只需要进一步传递它。在那之后,myMethod()的调用者应该处理异常。

但第二种方式是你自己处理它:

public void myMethod()  {
    try {
        someOtherMethod();
    } catch (Exception e) {
        System.out.println("You've got an exception!");
    }
}

手动关于投掷例外 - 您可以假设您在someOtherMethod()中执行此操作。执行throw new IllegalArgumentException("Please Enter Your Name..!");时,程序将停止并显示有关此异常的消息(除非您以 try-catch 方式处理它)。

最后,当您创建自己的Exception类时,扩展某些异常:

class MyException extends IllegalArgumentException {
    ...
}

在这种情况下,您可以在代码中执行throw new MyException();

我建议您阅读更多有关Java中的异常以了解正在发生的事情。您可以从this lesson开始。

答案 1 :(得分:0)

为确保您最终不会创建已在标准库中具有等效项的异常,我通常会在创建新异常之前查看文档。而且,如果你不小心的话,很容易因为非常大的异常层次结构而疯狂。不要因为你认为你需要以某种方式抛出一个而创建新的例外;创建一个,因为调用堆栈中的某个代码会对该异常做一些有用/不同的事情。

  

public Test(String yourName) throws IllegalArgumentException

您通常不会在throws子句中指定运行时异常,但如果您需要将此信息作为公共API的一部分,那么可能会有所帮助。

  

public Test(String yourName) extends IllegalArgumentException

这看起来不对,并且不是有效的Java。

答案 2 :(得分:0)

我只会在你需要的时候创建一个新的异常类型。当您希望调用者具有新异常的catch子句时,您需要一个新类型。

你可以创建新的例外只是为了更具描述性,但这就是我使用消息的原因。