Catalog
  1. 1. Java多线程与IO流学习笔记(一)
    1. 1.1. 异常
      1. 1.1.1. 概念
      2. 1.1.2. 异常体系
      3. 1.1.3. 异常的分类
      4. 1.1.4. 异常产生的过程解析
      5. 1.1.5. 异常的处理
      6. 1.1.6. 自定义异常
Java异常概述

Java多线程与IO流学习笔记(一)

异常

概念

异常指的是在程序执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。

在Java等面向对象的编程语言中,异常本身是一个类,长生异常就是创建异常对象并抛出了一个异常对象,Java处理异常的方式是中断处理。

异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行。

异常体系

异常机制其实是帮助我们找到程序中的问题,异常的根类是 java.lang.Throwable ,其下有两个子类: java.lang.Error 与 java.lang.Exception ,平常所说的异常指 java.lang.Exception 。

Throeable体系

  • Error严重错误,无法通过处理的错误,只能事先避免。
    1
    2
    3
    //OutOfMemoryError:java heap space
    //内存溢出的错误,创建的数组太大了,超出了JVM分配的内存。
    int[] arr = new in[1024*1024*1024];
  • Exception表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。

Throwable中常用方法

  • public void printStackTrace():打印异常的详细信息。
  • public String getMessage():获取异常发生的原因。

异常的分类

  • 编译时异常:checked异常。在编译时期就会检查,如果没有处理异常,则编译失败。
  • 运行时异常(RuntimeException):Java程序运行过程中出现的问题。

异常产生的过程解析

异常的处理

Java异常处理的五个关键字:try、catch、finally、throw、throws。

直接交给虚拟机处理:thorws XXXException;处理方式为中断处理,后续代码不会继续执行。

使用try-catch处理,后续代码如果没有问题可以继续执行。

throw关键字:

throw new XXXException(“异常产生的原因”)

注意:

  • throw关键字必须写在方法的内部
  • throw后面new的对象必须是Exception或者Exception的子类对象
  • throw关键字抛出指定的异常对象,我们就必须处理这个异常对象。后面是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理。throw关键字后面创建的是编译异常,我们就必须处理这个异常,要么throws要么try-catch
    1
    2
    3
    4
    throw new NullPointerException("空指针异常");
    throw new ArrayIndexOutOfBoundException("传递的索引值超出了数组的使用范围!")
    //判断传递的对象是不是空,并抛出一个异常
    Objects.requireNonNull(Object obj,"传递的对象值是空。");

throws关键字:

作用:

  • 可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理,最终交给JVM处理。

使用格式:在方法声明时使用

1
2
3
4
修饰符 返回值类型 方法名(参数列表) throws AAAException,BBBException{
throw new AAAException("产生原因");
throw new BBBException("产生原因");
}

注意:

  • throws关键字必须写在方法声明处
  • throws关键字后边声明的异常必须是Exception或者是Exception的子类
  • 方法内部如果抛出了多个异常对象,那么throws后边也必须声明多个对象,如果抛出的对象有子父类关系,那么直接声明父类异常即可。
  • 调用了一个声明抛出异常的方法,我们就必须处理声明的异常,要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM,要么使用try-catch。

捕获异常try-catch:
使用try-catch处理,后续代码如果没有问题可以继续执行。

1
2
3
4
5
6
7
8
9
try{
//可能会出现异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
//异常的处理逻辑,怎么处理异常对象
//工作中一般会把异常信息记录到一个日志中
System.out.println(e);
}catch(异常类名 变量名){
//catch可以有多个
}

注意:

  • try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象。
  • 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行之后的代码,如果try中没有产生异常,那么就不会执行catch中的执行逻辑。

finally代码块:
finally有时候异常发生会产生跳转,导致一些代码无法执行,finally代码块里面的代码无论发生什么情况都会执行。

什么时候代码必须执行?

  • 当我们在try代码块中打开了一些物理资源(磁盘文件,网络连接,数据库连接)时,我们都需要在使用完成之后关闭打开的资源。
1
2
3
4
5
6
7
8
9
10
11
try{
//可能会出现异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
//异常的处理逻辑,怎么处理异常对象
//工作中一般会把异常信息记录到一个日志中
System.out.println(e);
}catch(异常类名 变量名){
//catch可以有多个
}finally{
//无论是否出现异常都会执行
}

注意:

  • finally不能单独使用
  • 一般用于资源释放(回收),无论程序是否出现异常,最后都要资源释放。

自定义异常

Java给我们提供的异常类不够我们使用,需要自己定义一个异常类

1
2
3
格式:public class XXXException extends Exception|RuntimeException
//添加一个空参数的构造方法
//添加一个带异常信息的构造方法

注意:

  • 自定义异常类一般都是以Exception结尾,说明该类是一个异常类
  • 自定义异常类,必须继承Exception或者RuntimeException
  • 继承Exception那么自定义的异常类就是一个编译时异常,如果方法内部抛出了编译器异常就必须处理这个异常,要么throws要么try-catch
  • 继承RuntimeException,那么自定义的异常类就是一个运行时异常,无须处理,交给虚拟机处理
Author: zycode1561
Link: https://zycode1561.github.io/2020/01/14/Java%E5%BC%82%E5%B8%B8%E6%A6%82%E8%BF%B0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付宝

Comment