1

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

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

另外,我还有一个任务,我必须创建一个 java 类,并且规范模糊地指出构造函数应该抛出一个 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..!");
         }
    }

}

提前致谢。

4

3 回答 3

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 异常的更多信息,以了解发生了什么。你可以从这节课开始。

于 2013-09-19T19:06:52.787 回答
0

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

您可以创建新的例外以更具描述性,但这就是我使用该消息的目的。

于 2013-09-19T18:43:37.530 回答
0

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

public Test(String yourName) throws IllegalArgumentException

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

public Test(String yourName) extends IllegalArgumentException

这看起来不正确,也不是有效的 Java。

于 2013-09-19T18:41:30.167 回答