目录
*异常的分类
1.编译时异常/受查异常(IoException)
eg:NullPointerException,ArrayIndexsOutOfBoundsException
2.运行时异常/非受查异常(RuntimeException)
eg:FileNotFoundException, IOException, SQLException。
*异常的实质
*异常实际就是一个类,父类为Throwable,有Error 和 Exception 两个子类
*异常的捕获
1.用throws声明异常
public static void test(int[] a) throws CloneNotSupportedException{
if(a == null){
throws new CloneNotSupportedException;//必须写在方法体里面
}
}
2.捕获异常
public static void main(String[] args){
try{
test(null);//存放可能抛出异常的代码
}catch(CloneNotSupportedException){//捕获异常
e.printStackTrace();//输出异常代码所在处
System.out.println("捕获到了异常");
}
System.out.println("一眼万年");
}//抛出异常并输出:捕获到了异常
一眼万年
*finally一般用于资源的释放,finally中的代码一定会被执行
eg:键盘录入会占用资源,要在finally里sc.close();来释放资源(或者直接把scanner sc=new scanner(System.in)放在try里面)
*异常的注意事项
*异常一旦抛出,后面的代码不会执行
public static void main(String[] args){
int[] array = null;
System.out.println(array.length);
System.out.println("不潮不用花钱");//不会执行,因为jvm会抛出异常
}
*当我们没有解决异常,就交给JVM,一旦交给JVM程序就会奔溃
*可以通过逗号,声明多个异常
public static void Test(int[] a) throws CloneNotSupporatedException,NullPointerException{}
*可以写多个catch,但是Exception作为所有异常的父类能捕获所有的异常,如果把它放在catch的第一个,那么后面的异常就没有任何作用了
*不建议在finally里写return
*执行顺序:会先执行try中的代码,如果出现异常,就会看catch中的异常是否匹配,如果匹配就执行catch中的代码,如果不匹配,就会将异常向上传递到调用者,如果调用者也没有处理异常,就会继续传递,一直到main方法也没有处理,就交给JVM处理。无论是否匹配,finally中的代码一定会执行
*以登录方法为例:
//Test类中写一个登录方法
public void login(String name) throws UserNameException{
if(!this.name.equals(name)){
System.out.println("用户名错误");
throws new UserNameException;
}
}
//main方法中
public static void main(String[] args){
Test test = new Test();
try(test.login("aaa")){
}catch(UserNameException e){
e.printStackTrace();
System.out.println("用户名异常");
}finally{
}
}//输出用户名错误
错误代码所在处
用户名异常
*自定义异常类可以写有参构造
public class PassWorkException extends RuntimeException{
public PassWordException(String s){
super(s);
}
}//则输出异常所在处的时候会打印String s 中的内容
*一次只会抛出一个异常