Java语言中提供了许多种“异常类”,但是在实际代码中,具体的异常要具体的对待。
//此处定义为编译时异常
//如果需要定义为运行时异常,可以继承RuntimeException类
public class UserNameException extends Exception {
public UserNameException () {}
public UserNameException (String message) {
super (message);
}
}
此处带有String参数的构造方法会调用Exception类带有String参数的构造方法,而Exception类的构造方法又会调用它的父类——Throwable类带有String参数的构造方法,这个方法可以将异常信息存入new出的对象中,之后可以通过getMessage() 方法得到。
现在定义一个用户类,用户需要注册,当用户名小于4位时会抛出上方的自定义异常
public class User {
//
public void register (String name) throws Exception {
if (name.length () < 4) {
//手动创建异常对象
UserNameException e = new UserNameException ("用户名小于4位");
//手动抛出异常
throw e;
}
//如果代码可以执行到这个位置,则说明用户名不小于4位
System.out.println ("注册成功");
}
}
进入注册方法register (String name)中后,会对name进行判断,若小于4位,则手动抛出异常,否则继续执行代码。其中UserNameException类继承自Exception类,所以必须对异常进行处理,需要采用throws或try...catch...
如果使用try...catch...来处理异常,那么这里就相当于先用throw抛出了异常,you用try...catch...当场就解决了异常,但是我们手动抛出异常的目的就是为了让下面的测试类得知出现了异常,所以必须使用throws来将这个异常向上抛给这个方法的方法调用者,让它去解决或继续向上抛,直到方法解决或抛给JVM导致JVM关闭。
下面是测试类
public class Test {
public static void main (String[] args) {
//设定一个用户名以供测试
String username = "qwe";
//新建一个用户对象
User user = new User ();
//进行注册
try {
user.register (username);
}
//捕获UserNameException异常
catch (UserNameException e) {
System.out.println (e.getMessage ());
}
}
}
代码中调用了register方法,那么就会出现一个UserNameException类异常,我们在捕获后通过getMessage方法来获取之前构造这个对象时存入的信息,即“用户名小于4位”