体会异常

1.异常处理流程
1)程序先执行try中的代码
2)如果try中的代码出现异常,就会结束执行try中的代码,看和catch中的异常类型是否匹配
3)如果找到匹配的异常类型,就会执行catch中的代码
4)如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者
5)无论是否找到匹配的异常类型,finally中的代码都会被执行到(在该方法结束之前执行)
6)如果上层调用者也没有处理了的异常,就继续向上传递
7)一直到main方法也没有处理了的异常,就会交给JVM来进行处理
2.抛出异常
除了Java内置的类会抛出一些异常之外,程序猿也可以手动抛出某个异常,使用throw关键字来完成这个操作

ublic class Test {
    
    
    public static void main(String[] args){
    
    
        System.out.println(divide(10,0));
    }
    public static int divide(int x,int y){
    
    
        if(y == 0){
    
    
            throw new ArithmeticException("抛出除0异常");
        }
        return x/y;
    }
}
//执行结果
Exception in thread "main" java.lang.ArithmeticException: 抛出除0异常
	at Java0319.Java0322.Test.divide(Test.java:11)
	at Java0319.Java0322.Test.main(Test.java:7)

在这个代码中,我们可以根据实际情况来抛出需要的异常,在构造异常对象同时可以指定一些描述性信息
3.异常说明
在处理异常的时候,通常希望知道这段代码中究竟会出现哪些可能的异常
可以使用throws关键字,把可能抛出的异常显示的标注在方法定义的位置,从而提醒调用者要注意捕获这些异常

public static int divide(int x,int y)throws
 ArithmeticException{
    
    
 	if(y == 0){
    
    
 	throw new ArithmeticException("抛出除0异常");
 	}
 	return x/y;
 }

4.关于finally的注意事项
finally中的代码保证一定会执行到,这也会带来一些麻烦

public class Test {
    
    
    public static void main(String[] args){
    
    
        System.out.println(func());
    }
    public static int func(){
    
    
        try{
    
    
            return 10;
        }finally{
    
    
            return 20;
        }
    }
}

注意:
finally执行的时机是在方法返回之前(try或者catch中如果有return会在这个return之前执行finally),但是如果finally中也存在return语句,那么就会执行finally中的return,从而不会执行到try中原有的return
一般我们不建议在finally中写return(被编译器当做一个警告)
5.Java异常体系
1)Throwable派生出两个重要的子类,Error和Exception
2)其中Error指的是Java运行时内部错误和资源耗尽错误,应用程序不抛出此类异常,这种内部错误一旦出现,除了告知用户并使程序终止外,再无能为力,这种情况很少见
3)Exception是我们程序猿所使用的异常类的父类
4)其中Exception有一个子类称为RuntimeException,这里面又派生出我们常见的异常类
Java语言规范将派生于Error类或者RuntimeException类的所有异常称为非受查异常,所有的其他异常称为受查异常
如果一段代码可能抛出受查异常,那么必须显式进行处理
受查异常就是如果不显式处理,编译无法通过
显式处理的方式有两种:
a)使用try catch包裹起来
b)在方法上加上异常说明,相当于将处理动作交给上级调用者
6)自定义异常类
Java中虽然已经内置了丰富的异常类,但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展,创建符合我们实际情况的异常
例如:

public class Test {
    
    
    private static String userName = "admin";
    private static String password = "123456";
    public static void main(String[] args){
    
    
        try{
    
    
            login("admin","123456");
        }catch(PasswordError passwordError){
    
    
            passwordError.printStackTrace();
        }catch(UserError userError){
    
    
            userError.printStackTrace();
        }
    }
    public static void login(String userName,String password)
            throws UserError,PasswordError{
    
    
        if(!Test.userName.equals(userName)){
    
    
            throw new UserError("用户名错误");
        }
        if(!Test.password.equals(password)){
    
    
            throw new PasswordError("密码错误");
        }
        System.out.println("登陆成功");

    }
}

public class UserError extends Exception {
    
    
    public UserError(String message){
    
    
        super(message);
    }
}

public class PasswordError extends Exception {
    
    
    public PasswordError(String message){
    
    
        super(message);
    }
}

注意事项:
1)自定义异常类通常会继承自Exception或者RuntimeException
2)继承自Exception的异常默认是受查异常
3)继承自RuntimeException的异常默认是非受查异常

猜你喜欢

转载自blog.csdn.net/liyuuhuvnjjv/article/details/105057837