异常篇笔记

本文详细解释了Java中的异常分类(错误和异常)、异常处理机制(try-catch-finally,throw,throws),以及检查异常与非检查异常的区别。还介绍了自定义异常的创建和使用,包括自动流关闭的JDK7新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、异常

java.lang.Throwable是所有异常的顶级超类,它的下面派生了俩个子类

error:错误,表示系统级别错误,是不可恢复的错误,比如说虚拟机内存溢出

Exception:异常/意外,表示程序级别的异常,是可以通过异常处理机制恢复的错误

二、异常处理机制解决的问题

正常程序能走完,但因为某些特殊原因,像网络问题、突发情况发生时,在程序运行过程中可以进行修复的问题,才需要使用异常处理机制来解决。这时才需要使用异常处理机制来做个B计划。直白的说:你明知道会发生,但是还没有办法通过逻辑来处理的问题,才需要异常处理机制帮助解决。

三、异常处理机制

 示例:


try {
    // 可能会发生异常的语句
} catch(ExceptionType e) {
    // 处理异常语句
} catch(ExceptionType e) {
    // 处理异常语句
} catch(ExceptionType e) {
    // 处理异常语句
}finall{  //无论有无异常必定会走到的代码片段
...

1、try...catch(){}

try块中某句代码如果出现了异常,那么try块中此举及以下代码都不会执行了

try语句中如果不出现异常,catch块不执行

2、finally:

是异常处理机制中的最后一块**,不能独立存在**,它可以跟着try后(try...finally),或最后一个catch后(try...catctch...finally)

注意:

  1、finally可以保证无论try块中是否出现异常,最后finally都必定执行。通常用来做释放资源这类操作。

  2、**JDK7**之后,java提供了一个新特性:自动关闭特性。旨在IO操作中可以更简洁的使用异常处理机制完成最后的close操作。

自动流关闭

    - 语法

  JDK1.7后推出的特性:自动关闭特性
try (
    定义需要在finally中的流关闭更能(自动流关闭)
) {
  读写或其他操作
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
 

3、throw

用于对外主动抛出一个异常,通常请款下下面俩种情况我们主动对外抛出异常

当程序遇到一个满足语法,但是不满足业务要求时,可以抛出一个异常告知调用者,程序执行遇到一个异常,但是该异常不应当在当前代码片段中被解决时可以抛出给调用者
 

4、throws

当一个方法中使用throw抛出一个检查异常时,就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常,否则编译编译。

  注意:当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理这个异常,否则编译不通过。处理手段有两种:

  - 1 使用try-catch捕获并处理这个异常
  - 2 在当前方法上继续使用throws声明该异常的抛出给调用者解决。具体选取   那种取决于异常处理的责任问题。
  - 3不要在main()方法上throws。

四、异常分俩种

检查异常和非检查异常,检查是由编译器检查,检查的是当你抛出异常之后,你是否写了异常处理手段(try...catch若throws)

检查异常::当抛出异常时,检查你是否做了异常处理,若不处理则编译错误 **非检查异常:**当抛出异常时,不管你做没做异常处理,都不报错,只有RuntimeException家族的才是非检查异常,当然它的子类也是非检查异常。

常见的RuntimeException的子类- 运行时异常

类型错误转换,数组下标访问越界,空指针异常、找不到指定类等等。

自定义异常

自定义异常:通常用于定义那些不满足业务场景的异常  

自定义异常的几个要素:  

  1:类名要做到见名知义  

  2:需要继承自Exception(直接或间接继承均可)  

  3:提供超类异常提供的所有构造器

代码案例: 

package exception;  
import java.io.FileNotFoundException;  
public class Student {  
  private int age;  
  public int getAge() {  
    return age;  
  }  
public void setAge(int age) throws IllegalAgeException {  

  if(age < 0 || age >100){  
    /*  
  当使用threw抛出一个 非RuntimeException检查异常时,必须在当前方法上用throws声明该异常的抛出  
  */ 
  throw new IllegalAgeException("年龄不合法");  
  }  
    this.age = age;  
  }  
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鬼问路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值