异常:
就是Java代码编译和运行过程中出现错误的情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。
异常体系关系
Throwable : Throwable 类是 Java 语言中所有错误或异常的超类
|- Error : 错误,我们解决不了,不管了(如:JVM崩溃了,内存不足(栈溢出)等)
|- Exception: 异常
|- 编译期异常: 代码编写结束编译后,产生错误时, 我们今天要解决的就是这个问题
Date date = new DateFormat().parse("2015年11月26日");
|- RuntimeException运行期异常: 代码编译过程中没出错,运行的时候出错了
--------------------------------------------------------------------------------------------------------
* 异常处理:
* 方式1: 出现异常,自己解决
* 格式:
* try {
* 可以会出现异常的代码
* } catch (异常类 对象名) {
* 异常处理的方式
* }
* 方式2:出现异常,别人给我解决,我不管
*格式:
* 修饰符 返回值类型 方法名(参数) throws 异常类名1, 异常类名2,... {
* 可能出现异常的代码
* }
* 案例:
* //出现了异常,我不解决,抛出去,让调用者解决
* public static void method() throws ParseException{//抛出了一个异常
* //产生一个编译期异常
* Date date = new SimpleDateFormat("yyyy年MM月dd日").parse("2015-11-26");
* System.out.println(date);
* }
--------------------------------------------------------------------------------------------------------------
* 多个异常如何处理
* 方式1:
* 每一个异常单独处理
* 这种方式,所有的代码都会执行到
*
* 方式2:
* 可以把多个异常,一起处理,使用一个try,对应着多个catch的方式
* try {
* 可以出现异常的代码
* } catch(异常类1 对象1){
* 处理方式
* } catch(异常类2 对象2){
* 处理方式
* } ....
*
* 这种方式,当try代码块中出现异常后,try中的代码不再向下执行,直接跳转到对应的Catch中执行
*
* 案例:
* 问:当前第二种处理方式是不是不太合理啊,后面的代码都不执行了?
* 答:这种方式是合理的
* 比如: 你要开车回家, 可能会出现车轮子被偷的情况,没油的情况等;
* 当第一种异常车轮子被偷 出现后, 你还会继续开车吗?
* 必然不会后面的操作
* 方式3: 平行异常 jdk7以后出现的情况
* 格式:
* try {
* 可以出现异常的代码
* } catch(异常类1 || 异常类2|| ... e ){
* 处理方式
* }
*
异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。
特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。
-----------------------------------------------------------------------------------------------------------------------
* 异常类中常用的方法
* Throwable:
* 获取到异常类名
* 获取到异常原因
* 获取到异常产生的位置
*
* public String getMessage()
* 获取到异常原因
*
* public String toString()
* 获取到异常类名
* 获取到异常原因
*
* public void printStackTrace()
* 获取到异常类名
* 获取到异常原因
* 获取到异常产生的位置
-------------------------------------------------------------------------------------------------------------------------
异常类的关键字:
try: 在进行自己处理异常时使用,用来包含可能出现异常的代码
catch: 在进行自己处理异常时使用,用来将产生的异常进行处理
throws: 异常抛出交给调用者处理,只能在方法声明后面使用 , 代表该方法可能会抛出一个或多个异常对象
throw : 只能在方法内部使用,代表一定抛出了一个异常对象
finally: 它是异常处理语句的一部分,编写不管try代码块是否有异常产生,我都必须要执行的代码
throw 和throws关键字的区别:
throw用于抛出异常对象,后面跟的是异常对象;throw用在方法内。
throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在方法上。
-------------------------------------------------------------------------------------------------------------------------------
编译时被检查的异常和运行时异常的区别:
编译被检查的异常在方法内被抛出,方法必须要声明,否编译失败。
声明的原因:是需要调用者对该异常进行处理。
运行时异常如果在方法内被抛出,在方法上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
定义异常处理时,什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
-------------------------------------------------------------------------------------------------------------------------------
自定义异常: 其实就是自定义一个类 继承Exception 或者继承RuntimeException ,这样 该类就是异常子类了
public class ATMException extends Exception {
public ATMException() {
super();
}
public ATMException(String message) {
super(message);
}
}
自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作。
异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。
--------------------------------------------------------------------------------------------------------------------------------
return 与 throw 的区别?
共同点:
结束方法的运行并返回
不同点:
return 返回的成员为 变量值或者是普通对象值
throw 返回的成员为 异常对象
----------------------------------------------------------------------------------------------------------------
* 一个try 对应多个catch();
* 注意: 如果多个异常中有继承关系,子异常写上面,父异常写下面
try {
System.out.println(4/4);
//上面出现了异常,下面的代码不执行
int[] arr = {1,2,3};
System.out.println(arr[3]);
} catch (ArithmeticException e) {
e.printStackTrace();
} catch (Exception e) {//多态 Exception e = new ArrayIndexOutOfBoundsException();
e.printStackTrace();
}
throws
如果多个异常中有继承关系,只抛出父类异常即可,也可以都抛出
private static void method2() throws ArithmeticException, RuntimeException {
System.out.println(4/0);
//上面出现了异常,下面的代码不执行
int[] arr = {1,2,3};
System.out.println(arr[3]);
}
------------------------------------------------------------------------------------------------------------------------------
* finally: 它是异常处理语句的一部分
*
* 格式:
* try{
* 可能产生异常的代码
* } catch (异常类名 对象名) {
* 异常的处理代码
* } finally {
* 不管try代码块是否有异常产生,我都必须要执行的代码
* }
注意:
在执行到finally语句前,如果JVM结束了,该finally语句不执行
-------------------------------------------------------------------------------------------------------------------------------