如何在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,如IllegalArgumentException
和IllegalStateException
和UnsupportedOperationException
。 IllegalArgumentException
是我的最爱:
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.Exception
inheritance来创build自己的exception下面是一个可以帮助您实现的例子。
- 抛出ArgumentNullException
- 为什么使用终于在尝试…赶上
- 在构造函数中抛出ArgumentNullException?
- Asp.net mvc覆盖基本控制器中的OnException一直传播到Application_Error
- 什么时候可以捕获一个RuntimeException
- 为什么Java不允许从静态初始化块中抛出检查exception?
- 为什么Java 8types推断不考虑Lambdas在重载select中抛出的exception?
- Java List.add()UnsupportedOperationException
- UnobservedTaskException被抛出,但它由TaskScheduler.UnobservedTaskException处理程序和一个continuation OnlyOnFaulted处理程序处理