对于特定的问题可以按照Java对问题封装的思想,将特有的问题自定义为异常类。
创建自定义异常类时注意:
1.为自定义异常类取一个能标识异常状况的有意义的名字,能够根据名字判断异常类型。
2.一般的,用户自定义异常大多为运行时异常,令其继承Exception或者RuntimeException类。
3.自定义异常需要提供serialVersionUID。
4.自定义的异常必须通过throw手动自行抛出,它抛出的不是异常类,而是异常对象,每次只能抛出一个对象。
5.在异常类中至少定义两个构造方法,一个是无参构造方法,另一个是带String对象的参数的构造方法,将此对象传递给父类Exception的相同构造方法,这个对象将作为该异常对象的描述信息,即getMessage()方法的返回值。
例如,自定义一个异常类如下:
public class RegisterException extends Exception {
static final long serialVersionUID=34897193246939L;
public RegisterException(){}
public RegisterException(String s){
super(s);
}
}
测试类如下:
import java.util.*;
public class UserRegisteTest {
public void regist(int num) throws RegisterException{
if(num<0)
throw new RegisterException("注册账号为负值,不合理");
else
System.out.println("注册编号为:"+num);
}
public static void main(String[] args) {
UserRegisteTest t=new UserRegisteTest();
Scanner scn=new Scanner(System.in);
int ID=scn.nextInt();
try{
t.regist(ID);
} catch (RegisterException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
输出结果有以下可能:
①当输入的数大于或等于0时,如:
0
注册编号为:0
②当输入的数小于0时,如:
-1
注册账号为负值,不合理
RegisterException: 注册账号为负值,不合理
at UserRegisteTest.regist(UserRegisteTest.java:5)
at UserRegisteTest.main(UserRegisteTest.java:14)
上述代码中,regist()方法用throw抛出了自定义的异常,该方法本身不处理该异常,而是继续向上面一层抛出。main()方法调用regist(),编译器会强制要求main()方法处理RegisterException,并打印异常跟踪栈信息。