Java - 异常

本文详细介绍了Java中的异常处理机制,包括异常的分类、处理方式及自定义异常等内容,并提供了丰富的示例代码。

1 异常

  • 异常是程序在编译或运行时可能出现的问题
  • 例:
    • 用户输入的数据格式不正确等…
    • 数组越界、空指针异常、等…

1.1 异常层次结构

在这里插入图片描述

1.2 异常分类

  • Error 错误
    • 系统级别问题、内存不足,程序无问题。
  • Exception 异常
    • 1.编译期异常 ( 检查型异常 )
      • 编译期报错
      • 举例:
        • 试图超越文件末尾继续读取数据
        • 试图打开一个不存在的文件
        • SimpleDateFormat.parse()
    • 2.运行时异常 ( 非检查型异常 )
      • 编译正确,运行时报错。
      • 运行时异常一定是写的代码逻辑有错误。
      • 举例:
        • ArrayIndexOutOfBoundsException
        • NullPointerException

2 处理异常

  • 有两种方式:
    • 声明抛出异常:throws 不对异常进行处理,向上抛给方法的调用处,可最终抛给虚拟机,终止程序。
    • 捕获异常:try-catch 捕获异常,处理异常。

2.1 声明抛出异常

  • throws: 声明抛出的异常,将异常处理交由本方法的调用者处理。调用者再抛出或处理。
package core_Exception;
import java.io.EOFException;
public class Demo01 {
    ...
    public void m() throws EOFException {
        ...
        if(...){
            throw new XXXException(); //throw new XXXException()   抛出某个具体的异常对象。 
        }
        ...
    }
}

2.2 捕获异常

2.2.1 try - catch - finally

try{
	...
}catch(某种异常类 e){
	e.printStackTrace();
}catch(另一种异常类 e){
	e.printStackTrace();
}finally{
	...
}
/*
官方建议多个异常用一个catch捕获
try{
	...
}catch(Exception e){
	e.printStackTrace();
}
*/

2.2.2 执行流程

public static void main(String[] args){
	语句块1;
	try{
		异常语句2;
		语句3;
	}catch(异常类1 e){
		e.printStackTrace();
	}catch(异常类2 e){
		e.printStackTrace();
	}finally{
		语句3;
	}
	语句块4;
}
/*执行过程
1. 语句块1执行。
2. 程序执行到try{...}块,语句2抛出一个异常对象,跳过语句3的执行。
3. 用异常对象和catch中的挨个匹配,
4. 匹配成功,执行对应catch{...}块中的语句。
5. 匹配失败,JVM会捕获异常、打印异常信息,检查有无finally
6. 如果有先执行finally{}块中的语句,再终止整个程序。
7. 语句块4没能执行。
*/

2.2.3 catch中再次抛出异常对象

//方式一
try {
    System.out.println("");
} catch (ArrayIndexOutOfBoundsException e) {
    throw new IlleagalException("hello" + e.getMessage());
}
  • 希望在catch中throw一个新的异常,但是又不希望丢失引起异常的原始异常,使用initCause方法

Java异常的initCause方法分析

//方式二 提倡
try {
    System.out.println("");
} catch (ArrayIndexOutOfBoundsException e) {
    IlleagalException iE = new IlleagalException("hello");
    iE.initCause(e);
    throw iE;
}

2.2.4 try - with - rsources 释放资源

Java中的try-with-resources语句

//1.7
//try块退出后,会自动运行rs.close(); 关闭资源
try( Resources rs = ...){  
    work with rs;
}

//1.9+
Resources rs = ...;  //资源声明可以在try块外
try(rs){
    work with rs;
}
  • try-with-Resources 也可以有 catch子句、finally子句。这些子句在资源关闭后执行。

3 自定义异常类

  • 1、创建类继承Exception或者RuntimeException
  • 2、生成空参、满参构造器
package exception;
public class IlleagalNumberException extends Exception{
	
    public IlleagalNumberException() { }
    
    public IlleagalNumberException(String message) {
        super(message);
    }
}

4 处理异常的技巧

  • 不过分地细化异常 多个try-catch 可以写成 try-catch-catch
  • 尽量抛出合适的子类,而不是只是Exception/RuntimeException异常
  • 早抛出,晚捕获;方法抛出,main方法中捕获
  • 不要羞于抛出异常,更高层的方法通常可以更好的通知用户发生了错误。

5 异常注意事项

6 参考资料

B站黑马程序员视频

《Java 核心技术 卷Ι》第11版

Java中的try-with-resources语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值