一.异常的概念:
在Java程序中可能程序执行意外失败的事件称为异常
程序运行—>异常—>程序中断运行
异常的出现的情况
* ①.运行时磁盘空间不够
* ②.内存耗尽无法进行实例化
* ③.算术异常
* ④.JVM崩溃
- …
二.异常的体系结构
1.所有异常类的祖先是Throwable
2.异常可以分为Error和Exception
* ①.Error:错误 程序不进行处理
* ②.Exception:异常 在程序开发中,要对这些异常进行处理
* -- 编译时异常:在编译时出现的异常
* -- 运行时异常:在运行时出现的异常
三.常见的异常
* 1.数组下标越界的异常 ArrayIndexOutOfBoundsException
* 2.算术异常 ArithmeticException
* 3.空指针异常 NullPiontException
* 4.类型转换异常 ClassCastException
四.处理异常
处理异常的方式:抓抛模型
1.抛:
* 当执行程序时,一旦出现异常,就会生成一个对应异常类型的对象,并将对象抛出。
①.抛的类型:自动抛和手动抛
②.此异常的对象处理是交给方法的调用者
* Java程序在执行的过程中,如果出现异常,会自动生成一个异常类对象。将来交给方法的调用者。
2.抓:抓住程序中抛出的异常对象。
* 在Java程序运行时收到异常对象,会寻找能处理这种类型的代码,并把当前异常对象交给其来处理。
* 1.try-catch-finally
* try{
* // 可能会发生异常的代码
* }catch(Exception e1){
* // 处理方式一
* }catch(Exception e2){
* // 处理方式二
* }finally{
* // 一定要执行的代码
* }
* ①.try代码块里面存放的代码是有可能发生异常的代码,同时需要知道try代码块中声明的变量是局部变量,作用域是在代码块中
* ②.catch语句是用来处理异常
* getMessage():获取异常信息
* printStrackTrace():打印异常信息(程序出错的位置信息及原因)
* ③.catch代码块可以用多个,try中抛出的异常对象是从上往下去匹配catch中的异常对象,一旦满足就执行catch中的代码,执行完后就跳出所有的cathch
* ④.如果catch中多个异常是并列关系,不需要考虑顺序问题。
* ⑤.如果catch中有多个异常有继承关系,字类需要在父类异常对象上面。
* ⑥.finally是可选的代码块,如果加了finally,不论是否出现异常,都会执行finally中的代码。
提示:
①.对于运行时异常来说,可以不用显示的处理异常
②.对于编译时异常来说,必须要显示的进行异常处理。
public class TestException2 {
// 常见的异常
// 1.数组下标越界的异常
@Test
public void test1(){
try{
int[] numbers = new int[5];
System.out.println(numbers[5]);
} catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
}
// 2.算术异常
@Test
public void test2(){
try {
int i = 5;
System.out.println(i / 0);
} catch (ArithmeticException e) {
System.out.println(e.getMessage());
}
}
// 3.类型转换异常 ClassCastException
@Test
public void test3(){
Object date = new Date();
try {
String str = (String) date;
} catch (ClassCastException e) {
e.printStackTrace();
}
}
// 4.空指针异常 NullPointerException
@Test
public void test4(){
try {
String[] names = null;
System.out.println(names[0]);
} catch (NullPointerException e) {
e.printStackTrace();
}
}
@Test
public void test5(){
// 一旦出现异常.异常后面的代码不会执行
FileInputStream fs = null;
try{
int i = 10/0;
fs = new FileInputStream(new File("hello.txt"));
Thread.sleep(200);
}catch(IOException e){
e.printStackTrace();
}catch(InterruptedException e){
e.printStackTrace();
}catch (ArithmeticException e) {
System.out.println("分母不能为0");
}finally {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("我是一个帅哥");
}
}
如何自定义异常
- 1.自定义的异常类需要继承于现有的异常类(RunntimeException|Exception)
- 2.提供一个序列号,通过序列号可以唯一确定异常类的对象
- 3.需要提供一个重载的构造器
异常处理方式一:try-catch-finally(自行处理)
异常处理方式二:
* 1.在方法的声明处,显示的抛出异常对应的类型(委托处理)
* 2.语法格式:public void method() throws ClassCastException,FileNotFoundException
* 3.处理剖析:
* ①.当此方法内出现异常时,会抛出一个异常类的对象,抛给方法的使用者。
* ②.异常对象是可以一直向上抛,直到Main函数,也可以通过try-catch进行异常处理。
总结:
* 1.抓:异常的处理
* 两种处理方式:①.try-catch
* ②.throws+异常类型....
* 2.抛:一旦在程序执行中出现异常,会抛出一个异常类的对象
* 两种方式:①.自动抛出
* ②.手动抛出throw +异常类的对象