如何在Java中创build一个自定义的exceptiontypes?

可能重复:
我怎样才能自己写一个例外?

我想在Java中创build一个自定义exception,我该怎么做?

... try{ ... String word=reader.readLine(); if(word.contains(" ")) /*create custom exception*/ } catch(){ 

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

您应该能够创build一个扩展Exception类的自定义exception类,例如:

 class WordContainsException extends Exception { // Parameterless Constructor public WordContainsException() {} // Constructor that accepts a message public WordContainsException(String message) { super(message); } } 

用法:

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

您需要创build一个从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); } } 

您的问题不指定是否应该检查或取消选中这个新的exception。

正如你在这里看到的,这两种types是不同的:

  • 检查exception是为了标记一个有问题的情况,应该由调用你的方法的开发人员处理。 应该有可能从这种例外中恢复过来。 一个很好的例子是FileNotFoundException 。 这些例外是Exception的子类。

  • 未经检查的exception意味着代表您的代码中的错误,这是您可能无法恢复的意外情况。 NullPointerException是一个经典的例子。 这些exception是RuntimeException的子类

检查exception必须由调用方法来处理,或者通过捕获exception来处理,或者通过将其引发到调用方法。 即使有可能这样做,未经检查的exception并不意味着被捕获。

有关创build自定义exception类的很好答案。 如果你打算重新使用有问题的例外,那么我会遵循他们的回答/build议。 但是,如果您只需要一条消息引发的快速exception,那么您可以当场使用基本的exception类

 String word=reader.readLine(); if(word.contains(" ")) /*create custom exeception*/ throw new Exception("My one time exception with some message!"); } 

既然你可以创build并抛出exception,那么它可能就像一样简单

 if ( word.contains(" ") ) { throw new RuntimeException ( "Word contains one or more spaces" ) ; } 

如果你想更正式的话,你可以创build一个Exception类

 class SpaceyWordException extends RuntimeException { } 

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

作为一个小心的程序员经常会抛出一个特殊情况的exception,值得一提的一些通用的exception,如IllegalArgumentExceptionIllegalStateExceptionUnsupportedOperationExceptionIllegalArgumentException是我的最爱:

 throw new IllegalArgumentException("Word contains blank: " + word); 

除了从Exception延伸外,其他类都是类的Exception 。 所以,如果你创build自己的class级

 public class MyCustomException extends Exception 

你可以抛出这样的例子

  throw new MyCustomException( ... ); //using whatever constructor params you decide to use 

这可能是一个有趣的阅读

您只需创build一个扩展Exception(对于已检查的exception)或Exception的任何子类,或RuntimeException(对于运行时exception)或RuntimeException的任何子类的类。

然后,在你的代码中,只需使用

 if (word.contains(" ")) throw new MyException("some message"); } 

阅读Java教程。 这是每个Java开发人员应该知道的基本东西: http : //docs.oracle.com/javase/tutorial/essential/exceptions/

你必须把你的exception定义为一个新的类

 public class YourCustomException extends Exception{ //Required inherited methods here } 

然后,您可以尽可能多地抛出并捕获YourCustomException。

您可以通过从java.lang.Exceptioninheritance来创build自己的exception下面是一个可以帮助您实现的例子。