在自定义异常时,应如何派生?必须在
Throwable
类层次结构中派生,否则将不能在应用程序中传播异常。另外,不能从
Throwable
直接派生。
Throwable
为两类主要问题
(Exception
和
Error)
提供行为基础,不能为这棵继承树定义新分支。一般也不要直接继承
Error
或其任何子类,因为自定义异常通常不符合错误标准
(
即适当应用程序不应试图捕获的严重问题
)
。
一般我们自己定义的异常分为检查型异常checked(编译时异常:Exception和它的子类)和
非检查型异常
non-checked(运行时异常:RuntimeException和它的子类)。
以下两个例子表明的区别是:除非派生一个非检测异常类
(
RuntimeException
或
Error)
,否则调用方法的任何对象随后将按照“处理或声明”规则解决该异常。
RuntimeException:
package baal.exception;
public class BaalException extends RuntimeException {
public BaalException() {
}
public BaalException(String message) {
super(message);
}
}
package baal.exception;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Tester tester=new Tester();
tester.getNo1("baal");
}
}
package baal.exception;
public class Tester {
public void getNo1(String a) {
if("baal".equals(a))throw new BaalException("String is baal");
}
}
运行控制台信息:
Exception in thread "main" baal.exception.BaalException: String is baal
at baal.exception.Tester.getNo1(Tester.java:8)
at baal.exception.Main.main(Main.java:12)
Exception:
package baal.exception;
public class BaalException extends Exception {
public BaalException() {
}
public BaalException(String message) {
super(message);
}
}
package baal.exception;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Tester tester=new Tester();
try {
tester.getNo1("baal");
} catch (BaalException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package baal.exception;
public class Tester {
public void getNo1(String a) throws BaalException {
if("baal".equals(a))throw new BaalException("String is baal");
}
}
运行控制台的结果:
baal.exception.BaalException: String is baal
at baal.exception.Tester.getNo1(Tester.java:8)
at baal.exception.Main.main(Main.java:13)