如何在Java中创建自定义异常类型?

Maz*_*zzy 160 java exception

可能重复:
我如何自己编写例外?

我想在Java中创建一个自定义异常,我该怎么做?

...

try{

...

String word=reader.readLine();

if(word.contains(" "))
  /*create custom exception*/

}
catch(){
Run Code Online (Sandbox Code Playgroud)

当我创建自定义异常时throw new...,我得到错误unreported exception...must be caught or declared to be thrown

Rio*_*ams 229

您应该能够创建扩展Exception该类的自定义异常类,例如:

class WordContainsException extends Exception
{
      // Parameterless Constructor
      public WordContainsException() {}

      // Constructor that accepts a message
      public WordContainsException(String message)
      {
         super(message);
      }
 }
Run Code Online (Sandbox Code Playgroud)

用法:

try
{
     if(word.contains(" "))
     {
          throw new WordContainsException();
     }
}
catch(WordContainsException ex)
{
      // Process message however you would like
}
Run Code Online (Sandbox Code Playgroud)

  • 你应该添加两个构造函数(`WordContainsException(Throwable)`和`WordContainsException(String,Throwable)`)来正确支持[例外链接](http://docs.oracle.com/javase/tutorial/essential/exceptions/chained的.html) (8认同)
  • 没有添加任何`catch`? (3认同)

Laf*_*ica 114

您需要创建一个扩展自的类Exception.它应该如下所示:

public class MyOwnException extends Exception {
    public MyOwnException () {

    }

    public MyOwnException (String message) {
        super (message);
    }

    public MyOwnException (Throwable cause) {
        super (cause);
    }

    public MyOwnException (String message, Throwable cause) {
        super (message, cause);
    }
}
Run Code Online (Sandbox Code Playgroud)

您的问题未指定是应检查还是取消选中此新异常.

正如您在这里看到的,这两种类型是不同的:

  • 已检查的异常旨在标记应由调用方法的开发人员处理的有问题的情况.应该可以从这种例外中恢复.一个很好的例子是FileNotFoundException.这些异常是Exception的子类.

  • 未经检查的异常旨在表示代码中的错误,这是您可能无法从中恢复的意外情况.甲的NullPointerException是一个典型的例子.这些异常是RuntimeException的子类

检查异常必须由调用方法处理,通过捕获它并相应地执行,或者将其抛给调用方法.未经检查的异常并不意味着被捕获,即使有可能这样做.


Fei*_*ngo 16

关于创建自定义异常类的好答案.如果您打算重用有问题的例外,那么我会按照他们的答案/建议.但是,如果只需要使用消息抛出快速异常,则可以在现场使用基本异常类

String word=reader.readLine();

if(word.contains(" "))
  /*create custom exeception*/
  throw new Exception("My one time exception with some message!");
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是不好的做法,因为调用代码无法区分"我想抓住各种异常并做一些通用的","我想特别注意那个*所谓的*一次性例外并特别做某事".前一种捕获应该*仅在非常有限的条件下使用 - 例如在顶层循环中 - 这更加恶化了这种情况. (6认同)

emo*_*ory 12

既然您可以创建并抛出异常,那么就可以轻松实现

if ( word.contains(" ") )
{
     throw new RuntimeException ( "Word contains one or more spaces" ) ;
}
Run Code Online (Sandbox Code Playgroud)

如果您想要更正式,可以创建一个Exception类

class SpaceyWordException extends RuntimeException
{

}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,如果您使用RuntimeException,您的新内容Exception将被取消选中.


Joo*_*gen 10

作为一个细心的程序员往往会抛出一个异常,一个特殊的发生,值得一提的一些通用例外像IllegalArgumentExceptionIllegalStateExceptionUnsupportedOperationException.IllegalArgumentException是我的最爱:

throw new IllegalArgumentException("Word contains blank: " + word);
Run Code Online (Sandbox Code Playgroud)


Rob*_*bin 5

异常是一个类,就像任何其他类一样,除了它从中扩展Exception.所以,如果你创建自己的类

public class MyCustomException extends Exception
Run Code Online (Sandbox Code Playgroud)

你可以抛出这样的实例

   throw new MyCustomException( ... );
   //using whatever constructor params you decide to use
Run Code Online (Sandbox Code Playgroud)

可能是一个有趣的阅读