一、Exception:
Java提供的是异常处理的方式:抓抛模型
-
过程一:“抛”
-
程序在正常的执行过程中,一旦出现异常,就会在异常代码处生成对应异常类的对象,并将此对象抛出。
-
对象一旦抛出,在没有处理异常的情况下, 程序就不再向下执行。
-
关于异常类的对象的生成?分为两种情况:
① 系统自动生成异常类的对象,并抛出
② 我们可以根据程序的需要手动的创建一个异常类的对象,并抛出(throw)。
写法:在方法内使用“throw + 异常类的对象”
-
-
过程二:“抓”
-
理解为异常处理的方式:
-
方式一:try-catch-finally
-
方式二:throws
-
-
二、异常处理的方式一:try-catch-finally的使用
try{
//可能存在异常的代码
}catch(异常类型1 变量名1){
//异常的处理方式1
}catch(异常类型2 变量名2){
//异常的处理方式2
}catch(异常类型3 变量名3){
//异常的处理方式3
}finally{
//一定会被执行的代码
}
说明:
-
finally是可选的。
-
try中包含的是可能存在异常的代码。一旦执行,出现了异常,就会声明相应的异常类的对象,此对象在catch结构中进行匹配,一旦匹配。就进入catch中进行异常的处理。处理完以后,就不会再匹配后续的catch结构。而是退出try-catch结构,继续执行其后的代码。
-
多个catch中的异常类型如果满足子父类关系,则必须将子类声明在父类catch结构的上面,否则报错。
如果不满足子父类关系,则孰上孰下都可以。 -
常见的异常处理的方式:
方法1: e.getMessage() ;
方法2:e.printStackTrace(); -
try结构中声明的变量,在出了try结构以后就不可以被调用。
-
try-catch-finally结构可以嵌套
三、异常处理的方式二:使用throws关键字
说明:
1.在方法的声明处使用"throws + 异常类型"的方式抛出异常。
2.try-catch-finally的方式,可以理解为从根本上处理掉了异常,程序可以继续执行throws针对具体的使用此方式的方法来说,采用抛出的方式处理了异常。但是没有从根本上解决此异常,只是抛给了方法的调用者,方法的调用者也得考虑如何处理此异常
3. 思考:如何选择使用try-catch-finally还是throws呢?
- 如果代码中涉及到资源的关闭(比如:流的关闭、数据库连接的关闭、Socket的关闭等),必须使用try-catch-finally来处理异常。
- 父类被重写的方法没有使用throws的方式处理异常,则子类重写的方法也不能使用throws的方式处理异常。
- 在一个方法a中先后调用了方法b和方法c。通常方法b和方法c如果有异常的话,会使用throws的方式处理异常。而在方法a中可以考虑使用try-catch-finally的方式处理。
四、理解:
1.使用异常处理的方式来处理编译时异常,处理完以后相当于把编译时异常延迟到运行时才可能出现。
2.程序中,如果可能报编译时异常,则一定需要进行异常的处理。如果是运行时异常,则可以不进行处理。[手动抛出异常(”throw 异常对象“) 和自动抛出异常(系统自动生成异常对象并throw)相同,如果手动抛出的是运行时异常就可以不用处理,如果抛出的是非运行时异常则需要用try-catch-finally或throws处理]
五.Error:
java虚拟机无法解决的严重问题。
如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性的代码进行处理。
六、用户自定义异常类
-
一般地,用户自定义异常类都是RuntimeException的子类。(自定义异常类需要继承异常,最好不要继承Throwable 因为其包含Error。所以最大继承Exception,常继承RuntimeException,因为运行时异常可以不用try-catch或throws处理,在运行时才会产生的异常)
-
自定义异常类通常需要编写几个重载的构造器。
-
自定义异常需要提供serialVersionUID
-
自定义的异常通过throw抛出。
-
自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。
常见的Exception:
-
java.lang.Throwable
-
|—java.lang.Error:错误,不编写针对性的代码进行处理
-
|—java.lang.Exception:异常,使用针对性的代码进行处理
-
|—编译时异常(非RuntimeException、Checked异常):在执行javac.exe命令时可能出现的异常
-
|----IOException
-
|—FileNotFoundException
-
-
|—运行时异常(RuntimeException、属于UnChecked异常):在执行java.exe命令时可能出现的异常
-
|-----InputMismatchException
-
|-----ArithmeticException
-
|-----NumberFormatException
-
|-----ClassCastException
-
|-----NullPointerException
-
|-----ArrayIndexOutOfBoundsException
-
-
-
Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。