异常

一.概述

1、生活中的异常
     生活中不正常的事件。
2、程序中的异常
    程序在运行时出现的错误!
    程序中异常以类的方式表示,当程序中出现异常时,就是产生了某种异常类的对象。
    而异常对象必须进行捕获并处理,如果不捕获,则异常对象由JVM处理。
    而JVM处理异常的方式为:把异常信息输出在控制台,并终止程序。

二.异常继承结构

1.异常结构继承结构图


2、异常的分类
1) 运行时异常 :RuntimeException及子类。不强制处理
2)编译异常  :Exception类及非RuntimeException的子类。必须处理,如果不处理则引发编译错误

三.异常处理的第一种方法throws

1、throws关键词的使用:在方法上声明异常,此方法没有处理异常。由调用者处理
语法:
访问修饰符   返回值类型  方法名(参数列表)throws 异常类型,异常类型{方法体}

1 public class Test{
2    public static void main(String[] args) throws FileNotFoundException{
3       getIO();
4       System.out.println("程序结束");
5    }
6    public static void getIO() throws FileNotFoundException{
7       FileInputStream in = new FileInputStream("d:/a.txt");
8    }
9 }

四.处理异常的第二种方法try catch

1、try catch语法结构

try{

可以会出现异常的代码。

}catch(异常类型  变量名){  //捕获对应类型的异常对象,保证后续代码继续执行。

}
2、try catch的执行顺序

2.1:try中的代码 没有产生异常,则catch不执行,而执行try-catch后的代码

2. 2 :try中的某行代码产生了异常,则try中的后续代码不再执行,而到对应异常类型的catch执行,执行完catch后,执行try-catch后的代码

3、try块中带有多个catch时的注意事项
如果多个catch之间的异常类型之间有继承关系,则先子后父。

异常对象:取得异常描述信息:getMessage();取得异常的堆栈信息:printStackTrace();

五.异常的finally语块

1、finally语句块的含义

在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行


2、try,catch,finally三个关键词的执行顺序

3、何种情况下不执行finally块

异常处理代码中执行System.exit(1)退出Java虚拟机

六.final,finalize,finally区别

final:java中的关键字,修饰符。
    1)、可以修饰类
    如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。    
    2)、 可以修饰方法
        被声明final的方法,不能被子类重写。
   3)、修饰变量,
        如果将变量或者方法声明为final,可以保证它们在使用中不被改变.  

 2 finally:java的一种异常处理机制。。finally 结构使代码总会执行,而不管有无异常发生。

 3  finalize:Java中的一个方法名。

    Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。
     这个方法是由垃圾收集器在确定这个对象没有被引用时 对这个对象调用的。
     它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。
     finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

七.手动抛异常throws

1、throw 异常对象
当程序中的某个代码产生异常:生成一个异常的对象,并抛出
异常都在代码里产生的,throw new  异常类型();
使用throw关键词抛出异常对象。
1) 可以抛出运行时异常: 可以不处理
2) 抛出编译异常: 必须处理。
2 当方法中抛出异常后要对此异常进行处理
1)、 throws在方法上添加异常的声明。
2) 、try-catch进行异常的捕获。

八.自定义异常(代码开发中常用)

1、自定义异常的语法
访问修饰符   class 类名  extends Exception或其子类{}

 1 /*
 2 *自定义异常类继承自某个异常类
 3 *可以继承运行时异常:异常类可以不处理
 4 *可以继承编译异常:异常类必须处理
 5 *产生自定义异常类型:需要用throw
 6 */
 7 public class AgeException extends Exception{
 8    public AgeException(){
 9       super();
10    }
11    public AgeException(String message){
12       super(message);
13    }
14 }

2 、产生自定义异常一定与throw关键词一起使用

 1 public class Student(){
 2    private int age;
 3    public int getAge(){
 4       return age; 
 5    }
 6    public void setAge(int age) throws AgeException{
 7       if(age >= 18&& age<=50){
 8          this.age = age;
 9       }else{
10          //产生一个异常对象,手动产生异常对象,并抛出
11          /*
12          *抛出编译异常,则必须捕获或声明
13          */
14          throw new AgeException("年龄必须为18~50之间");
15       }
16    }
17 }
原文地址:https://www.cnblogs.com/wangzhengyu/p/8532494.html