- 一、什么是异常?
- 在java程序中可能程序执行意外失败的事件叫做异常
- 程序运行—出现异常—程序中断了
- 异常出现的情况:
- 1.内存耗尽了无法进行实例化
- 2.JVM崩溃
- 3.数组下标越界异常
- 4.算术异常
- …
- 二、异常体系
- 1.所有的异常类的祖先是Throwable
- 2.异常分为两部分:Error和Exception
- Error:错误,程序是不能进行处理的,就是不可通过代码处理的异常
- Exception:在程序开发期间,要会这种异常进行处理,可以通过代码处理的异常
-
--IOException:编译时异常,在编译期间出现的异常
-
--RunTimeException:运行时异常,在程序运行期间出现的异常
- 三、常见的几种运行时异常
- 1.数组下标越界异常:ArrayIndexOutOfBoundsException
- 2.算术异常:ArithmeticException
- 3.空指针异常:NullPointerException,通过打断点,百分之百的可以找到,最容易找到的异常
- 4.类型转换异常:ClassCastException
//StackOverflowError:栈溢出,像这种是我们代码解决不了的
-
四、如果处理Exception异常
-
处理异常的方式:抓抛模型
-
1.抛:当执行程序的时候,一旦出现异常,就会生成一个对应的异常对象,并将对象抛出
-
(1)抛的类型:自动抛和手动抛,一般自动抛就可以了
-
(2)使异常对象处理交给方法的调用者
-
一旦出现异常,就会生成一个对应的异常对象,并将对象抛出。将来给方法的调用者
-
2.抓:抓住程序中抛出的异常对象
-
在java程序运行时收到异常对象,会寻找能够处理这种异常的异常代码,并将当前的异常对象交给其来处理。
-
怎么抓异常对象呢?抓的过程就是异常处理的方法
-
java处理异常提供了两种方式
-
(1).try{ //自己处理异常
-
//可能会出现的异常代码
-
}catch(异常对象1 e){
-
处理异常的方式;
-
}catch(异常对象2 e){
-
处理异常的方式
-
}finally{
-
//一定会被执行的的代码
-
}
-
①.try代码块里面放的是可能会出现的异常代码,同时要清除在try定义的变量,相当于if
-
都是局部变量,作用域在try代码块中
-
②.catch用来处理异常
-
自定义打印信息
-
printStackTrace():打印堆和栈的错误信息(程序出错的位置及原因)
-
getMessage():打印错误信息(错误原因)
-
③catch代码块可用定义N个,try中抛出的异常对象从上往下去匹配catch中的异常类型,
-
如果一旦满足,就执行catch里面的代码,执行完成后就跳出所有的catch
-
④。如果有多个catch,多个catch的异常对象是并列关系的话,比如说:都属于运行时异常,不需要考虑catch
-
⑤.如果有多个catch,多个catch的异常对象是继承关系的话,子类需要在父类的上面,父类放到最后面,比如RuntimeException要放到空指针异常后面
-
⑥.finally可选的代码块(可加可不加),如果finally,不论是否会出现异常,都会执行finally里面的代码
-
就是遇到return,finally里面的代码块也会执行
-
注意:如果异常处理了,那么后面的代码会继续执行
-
运行时异常:可以不显示的进行处理,可以不处理,只是运行的时候会出现异常
-
编译时异常:必须要显示进行异常处理,必须处理,不然就运行不了,因为编译就不通过
-
处理:选中异常的代码,ctrl+alt+t,选择6try/catch
-
(2)throws:找别人帮我处理异常
-
代码出现了异常,后面的代码就不会运行,但是加了异常处理,之后的,夹中间还是不会运行,后面的代码还会继续运行
-
异常处理的第一种方式:try-catch-finally(自己处理)
-
异常处理的第二种方式:
-
1.在方法的声明处,显示的抛出异常对象类型(委托处理)
-
谁处理呢,谁调用谁处理,相当于把异常往上抛
-
2.语法:
-
public static void test1() throws FileNotFoundException,IOException
-
注意:平行关系;随便没有顺序。继承关系:子类在前,父类在后
-
3.处理方式:
-
(1)该方法内出现异常是,会抛出一个异常对象,抛给方法的调用者
-
(2)异常对象可以一直向上抛,直到抛给main方法,也可以通过try-catch进行显示的处理异常
-
一层层往上抛,最终还是就会通过t
-
ry-catch进行显示的处理异常
-
总结:
-
1.抓:异常处理
-
两种处理方式:try-catch throws+异常类型
-
2.抛:一旦在程序执行期间出现异常,会抛出一个异常类对象
-
两种方式
-
自动抛
-
手动抛 throw+异常类的对象,注意:throw没有加s,基本上都是运行时异常,所以自定义的时候,可以直接继承RuntimeException
-
这个异常类可以是现成的异常类(就是java给提供的异常类),也可以是自己定义的异常类
*/
//注意:main方法也可以往上抛,这个时候就会抛给JVM虚拟机,JVM虚拟机肯定处理不了这个异常,他就会报错
/**
-
如果和自定义一个异常类?
-
1.自定义的异常类需要显示的继承RuntimeException
-
2.提供一个序列号
-
3.提供一个无参和有参的构造方法
*/
public class MyException extends RuntimeException{
static final long serialVersionUID = -7034897190745766939L;//随机生成的序列号,直接粘就可以了public MyException() {
}public MyException(String mess) {
super(mess);
}
}