Java有着非常强大的异常处理机制,异常的祖先是Throwable,有如下两个子类:
Error:表示错误,错误产生后程序员不能通过代码的方式纠正,只能事先避免,好比生命已经停止。
Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的
异常分为编译时异常和运行时异常。
编译时异常又叫编译时被监测的异常:在程序编译过程中监测到非运行时异常的异常,出现该异常要么向上抛出,要么捕获处理。
运行时异常(runtimeException及其子类):在程序编译过程中监测到出现运行时异常,函数上或内部可以直接抛出异常,不需要捕获和声明。
总体异常的分类
处理异常的方式
抛出异常 throw
声明异常 throws 向上抛出
异常捕获 try-catch 自己处理
static String[] usernames={"张三","赵四","王五"}; public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入注册的名字!"); String next = sc.next(); //try-catch捕获异常 try { checkUsername(next); } catch (RegisterException e) { e.printStackTrace(); } } public static void checkUsername(String usrename) throws RegisterException {//声明异常 for (String name : usernames) { if (name.equals(usrename)){ throw new RegisterException("亲,该用户已经被注册!");//抛出异常 } } System.out.println("恭喜您,注册成功!"); }
打印异常的方法
public String getMessage() :获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
public String toString() :获取异常的类型和异常描述信息(不用)。
public void printStackTrace() :打印异常的跟踪栈信息并输出到控制台
具有继承关系的异常
如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
自定义异常类
需要继承Exception(编译器异常)或者RunTimeException(运行时异常)
public class RegisterException extends Exception { public RegisterException() { } public RegisterException(String message){ super(message); } }