> 文档中心 > 异常的总结

异常的总结


异常

1.异常概述与异常体系结构

在java语言中,将程序执行中发生的不正常情况称为"异常"。(语法错误和逻辑错误不是异常)

异常事件可分为两类:

  1. Error:java虚拟机无法解决的严重问题。如:资源耗尽等情况。

  2. Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:

    • 空指针访问

    • 试图读取不存在的文件

    • 网络连接中断

    • 数组角标越界

对于这些错误,在编写程序时,就考虑到错误的检测,错误消息的提示,以及错误的处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87t8ZR7P-1654065751736)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220530161735609.png)]

红色为编译时异常

蓝色为运行时异常

2.异常处理方式

java提供的是异常处理的抓抛模型

过程一:抛——程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。一旦抛出后,其后的代码不再执行。

过程二:抓——可以理解为异常的处理方式。

2.1 try-catch-finally

说明:

  1. finally是可选的
  2. 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据对象的类型,去catch中进行匹配。
  3. 一旦try中的异常对象匹配到某一个catch中,就进入catch中进行异常的处理,一旦处理完成,就跳出当前的try-catch结构(没有finally的时候),继续执行其后的代码
  4. 注意:catch中的异常类型如果满足子父类关系,则要求子类一定要声明在父类之上。否则,报错。
  5. 常用的异常对象处理的方式:1. getmessage() 2.printStackTrace()
  6. 在try结构中声明的变量,出了try结构以后不能被调用
  7. 使用try-catch-finally处理编译时的异常,是程序在编译时就不报错了,运行时仍有可能报错,相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。
try {    //可能出现异常的代码}catch (){//异常类型1 变量名1    //处理异常的方式一}catch (){//异常类型2 变量名2    //处理异常的方式二}finally {    //一定会执行的代码}

2.1.1 Finally

finally是可选的

finally中声明的是一定会被执行的代码。即使catch中又出现了异常

像数据库连接,输入输出流等资源,jvm是不能回收的,我们需要手动释放。此时的资源释放,就需要声明在finally中。

public static int method(){    try { int[] ints = new int[10]; System.out.println(ints[10]); return 1;    }catch (ArrayIndexOutOfBoundsException e){ e.printStackTrace(); return 2;    }finally { System.out.println("666");    }}

先会输出666,再返回2

2.2 throws+异常类型

说明:

1."throws+异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不会执行。

体会:

try-catch-finally:真正的将异常处理掉了。

throws:只是将异常抛给了方法的调用者。并没有将异常处理掉。

public void text01() throws FileNotFoundException, IOException {    FileInputStream inputStream = new FileInputStream("yyh.txt");    int len;    byte[] bytes = new byte[1024];    while ((len=inputStream.read())!=-1){ int str = inputStream.read(bytes,0,len); System.out.println(str);    }}

3.手动抛出异常

throw new +异常类型

public class Throwtest {    private int id;    public  void yyh(int id) throws Exception { if (id>0){     this.id=id; }else {     throw new Exception(); }    }    public static void main(String[] args) { Throwtest throwtest = new Throwtest(); try {     throwtest.yyh(-8); } catch (Exception e) {     throw new RuntimeException(e); }    }}

4.自定义异常类

  1. 继承于现有的异常结构:RuntimeException,Exception
  2. 提供全局常量:serialversionuid 序列号
  3. 提供重载的构造器
public class MyException extends Exception{    static final long serialVersionUID = -3387516993124229948L;    public MyException(){    }    public MyException(String msg){ super(msg);    }}

5.总结

sionUID = -3387516993124229948L;

public MyException(){}public MyException(String msg){    super(msg);}

}

## 5.总结![总结](https://img-blog.csdnimg.cn/df97b59891fc460b8ecb44800c5f2162.png#pic_center)

开发者涨薪指南 异常的总结 48位大咖的思考法则、工作方式、逻辑体系