如何在Java中定义自定义exception类,最简单的方法是什么?
我试图定义我自己的exception类最简单的方法,这就是我得到的:
public class MyException extends Exception {} public class Foo { public bar() throws MyException { throw new MyException("try again please"); } }
这是Java编译器所说的:
cannot find symbol: constructor MyException(java.lang.String)
我有一种感觉,这个构造函数必须从java.lang.Exception
,不是吗?
不,你不“inheritance”非默认的构造函数,你需要在你的类中定义一个接受string的构造函数。 通常在构造函数中使用super(message)
来调用父类的构造函数。 例如,像这样:
public class MyException extends Exception { public MyException(String message) { super(message); } }
我定义的一个典型的自定义exception是这样的:
public class CustomException extends Exception { public CustomException(String message) { super(message); } public CustomException(String message, Throwable throwable) { super(message, throwable); } }
我甚至使用Eclipse创build一个模板,所以我不必一遍又一遍地写所有的东西。
如果您在Eclipse中使用新的类对话框,您可以将Superclass字段设置为java.lang.Exception
并检查“超类的构造函数”,它将生成以下内容:
package com.example.exception; public class MyException extends Exception { public MyException() { // TODO Auto-generated constructor stub } public MyException(String message) { super(message); // TODO Auto-generated constructor stub } public MyException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub } public MyException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub } }
为了回应下面的问题,在默认构造函数中不要调用super()
,Oracle有这样的说法 :
注意:如果构造函数没有显式地调用超类构造函数,那么Java编译器会自动插入对超类的无参构造函数的调用。
在Java平台的inheritance文章中解释了这个原因:
“一个子类从其父类inheritance所有的成员(字段,方法和嵌套类), 构造函数不是成员 ,所以它们不被子类inheritance,但是超类的构造函数可以从子类中调用。
package customExceptions; public class MyException extends Exception{ public MyException(String exc) { super(exc); } public String getMessage() { return super.getMessage(); } }
import customExceptions.MyException; public class UseCustomException { MyException newExc=new MyException("This is a custom exception"); public UseCustomException() throws MyException { System.out.println("Hello Back Again with custom exception"); throw newExc; } public static void main(String args[]) { try { UseCustomException use=new UseCustomException(); } catch(MyException myEx) { System.out.println("This is my custom exception:" + myEx.getMessage()); } } }
exception类有两个构造函数
-
public Exception()
– 这个构造了一个Exception,没有任何附加的信息。exception的本质通常是从类名中推断出来的。 -
public Exception(String s)
– 用指定的错误消息构造一个exception。一个详细消息是一个描述这个特定exception的错误条件的string。
如果从Exceptioninheritance,则必须提供一个将String作为参数的构造函数(它将包含错误消息)。