我试图用最简单的方法来定义我自己的异常类,这就是我得到的结果。
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
,不是吗?
我定义的一个典型的自定义异常是这样的。
public class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
public CustomException(String message, Throwable throwable) {
super(message, throwable);
}
}
我甚至用Eclipse创建了一个模板,这样我就不用重复写所有的东西了。
如果你在Eclipse中使用新类对话框,你可以直接将Superclass字段设置为java.lang.Exception
,然后选中"Constructors from superclass"。
然后它会生成以下内容。
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
}
}
针对下面关于不在defualt构造函数中调用super()
的问题,Oracle有这样说。
注意:如果一个构造函数没有明确调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。
原因在Java平台的[继承][1]条中有解释,其中说。
"一个子类继承了所有成员(字段、方法和嵌套的 >.类)从它的超类。 类)的超类。 构造函数不是成员,所以它们是 >.的构造函数是不被子类继承的。 不被子类继承,但超类的构造函数为 >.可以从子类中调用。 可以从子类中调用."。
[1]: http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
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());
}
}
}
异常类有两个构造函数
public Exception()
-- 这将构建一个没有任何附加信息的异常,异常的性质通常由类名来推断。public Exception(String s)
--构造一个带有指定错误信息的异常,详细信息是一个字符串,描述了这个特定异常的错误条件。