Java 异常

Throwable  

Error错误  Exception异常

             RuntimeException

 

异常 处理掉 程序可以继续执行

错误  不修改  程序无法执行  例如 java.lang.OutOfMemoryError: Java heap space

 

 

异常的关键字

 

throw 在方法内部  抛出异常的对象

throw 后面  必须写new  对象  ,且此对象必须是  Throwable的子类Exception的对象或Exception子类的对象  总之必须是可以被抛出的对象  不可是常见的普通类对象

 

 

throws 用于方法的声明上  表明此方法 可能出现异常  请调用者处理  不处理 则编译失败!

调用者对异常的处理 有两种选择 

1. 继续向上一级抛出,由上级处理

2.自己内部 try catch  处理掉

 

try{

}catch( 异常类类名  变量){

 循环 判断 调用其他方法  变量运算

}finally{

 无论是否异常发生 都必须被执行的代码

常见应用  资源的释放

}

 

 

 

 

多catch写一起

catch后的小括号中可以写多个异常类的类名,

这些类名 彼此有顺序概念存在

平级之间的类 顺序无所谓前后  平级的异常类 异常类没有继承关系

上下级关系的类  越高级的父类 越要写在下面!  【多态调用  catch捕获到的异常类对象 =  被调用方法抛出的new 异常类对象      父类 父类引用 = new 子类 对象】

 

 

 RuntimeException 与 Exception异常存在处理上的差异

 方法中 存在 RuntimeException  运行时异常 时,该方法的声明 无需 throws  RuntimeException   ,因为这种运行时异常 是必须手动修改代码的  异常发生后的代码都是无意义的代码

由于方法声明中无需 throws 因此 调用方法的方法中也不需要 try catch

在执行方法期间抛出但未捕获的RuntimeException的任何子类都无需再throws子句中进行声明

 

编译异常 调用了抛出异常的方法 不处理编译失败 必须 try catch

运行异常 抛出的异常是RuntimeException类或它的子类

运行异常的特点:

方法内部抛出的异常是运行异常 newXXXException

方法声明上 不需要throws语句 调用者 不需要处理

设计原因 运行异常 不能发生 如果发生 程序员需要修改程序源代码

一旦发生  已不需异常处理  只能代码级修改~  

        int[] arr = {1,2,3};
        //if判断 运行时 JVM抛出运行时异常的子类异常  ArrayIndexOutOfBoundsException
        if(arr[5]>5){
            int i = arr[5]+1; //运行时异常 后续的代码都没有存在的意义
        }
        String s = null;
        boolean b = s.endsWith("#"); // 运行时 JVM抛出运行时异常的子类异常  NullPointerException  
        

 

    private static void function1() {
        
        int avg = avgNumber(1,4,6,2,-3,7);
        System.out.println("平均数:"+avg);
        
    }
    private static int avgNumber(int...source){
        
        int sum = 0;
        for(int s: source){
            if(s < 0){
                throw new RuntimeException("传入的参数 存在负数");
            }
            sum = sum+s;            
        }
        
        return sum/source.length;
        
    }

 

 

父类的方法 如果抛出异常  子类重写父类方法时

 子类方法可以抛出异常 但此异常不能大于父类异常(异常的上下级关系)

 子类方法 也可以 不抛出异常!

 

假设 子类继承了父类  重写了父类某方法

父类中该方法没有异常

那么 子类中被重写的该方法 必然没不能在方法声明中 throws 异常类名

但 该方法中若恰好掉用了其它方法 而被调用方法会抛出异常,则 子类别无选择 因其不能 throws 向外抛出   就只能在自身内部 try catch 处理掉被调用方法抛出的异常

 

 

Throwable类中的与异常类信息有关的三个方法  

String getMessage()  //异常信息的详细描述

String toString() //异常信息的剪短描述

void printStackTrace() //将异常信息追踪到标准的错误流 异常信息最全  JVM默认使用了此方法!

 

 

自定义异常类 必须继承 Exception或 RuntimeException  且 要写好自定义类的 构造方法

 
public class FuShuException extends RuntimeException{

    public FuShuException() {
    }

    public FuShuException(String message) {
        super(message);
    }
    

}

 

 

public class TestException {

    public static void main(String[] args) {
        
        try {
            function1();
        } catch (FuShuException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
            
        }        

    }
    
    private static void function1() {
        
        int avg = avgNumber(1,4,6,2,-3,7);
        System.out.println("平均数:"+avg);
        
    }
    
    private static int avgNumber(int...source){
        
        int sum = 0;
        for(int s: source){
            if(s < 0){
                throw new FuShuException("传入的参数 存在负数");
            }
            sum = sum+s;            
        }
        
        return sum/source.length;
        
    }


}

 

posted @ 2020-05-19 12:44  CherryYang  阅读(209)  评论(0)    收藏  举报