如何在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作为参数的构造函数(它将包含错误消息)。