Java常见的异常处理总结

  • 异常中的核心概念: try、catch、finally、throws、throw ;
  • 在程序运行过程中,如果产生错误,则抛出异常;
  • 通过try语句来定义代码块,运行可能抛出异常的代码;
  • 通过catch语句来捕获特定的异常并做相应的处理;
  • 通过finally语句可以保证即使产生异常(处理失败),也可以在事后清理资源等
  • Java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查异常;所有的其他异常称为受查异常。

异常处理流程

程序先执行 try 中的代码
如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
如果找到匹配的异常类型, 就会执行 catch 中的代码
如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
如果上层调用者也没有处理的异常, 就继续向上传递.
一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止.

1、Java异常类层次结构图

在这里插入图片描述

2、错误异常类

Error类和其子类通常用于程序无法处理的错误,这些异常发生时,Java虚拟机一般会在控制台打印相应的错误信息,并终止程序的进行,这种内部错误一旦出现,除了告知用户并使程序安全终止之外,再无能无力。这种情况很少出现。

3、运行时异常类

RuntimeException类及其子类,一般是由程序逻辑错误引起。如果程序本身没有问题,但由于I/O问题引发的错误称为IOException。
:ClassCastException、IllegalArgumentException、ArithmeticException、NumberFormatException
Exception与RuntimeException的区别

  1. Exception是RuntimeException的父类,使用Exception定义的异常都要求必须使用异常处理,而使用RuntimeException定义的异常可以由用户选择性的来进行异常处理,不需要进行强制性的异常处理,比如public static int parseInt(String s) throws NumberFormatException,本身就进行了处理

4、非运行时异常类

除 RuntimeException类及其子类,它是必须处理的异常,若不处理程序不能编译通过
例:java.io.IOException、ClassNotFoundException、java.io.FileNotFoundException

5、非检测异常

包括错误异常类(Error)和运行时异常类(RuntimeException),非检测异常一般属于系统错误,调用可能产生非检测异常的代码时可以不使用try…catch处理

6、检测异常

包括非运行时异常类,强制使用try…catch处理,若没有则会产生编译错误

7、自定义异常类

归类于非运行异常类,一般定义为可检测异常,自定义异常类一般包括俩个构造方法,一个是默认构造方法,一个是带String参数的构造方法。

  • 有些异常java没有提供,就需要自己定义一个异常类
  • 自定义异常通常会继承自 Exception 或者 RuntimeException
    继承自 Exception 的异常默认是受查异常
    继承自 RuntimeException 的异常默认是非受查异常
class AddException extends Exception{
    public AddException(String message){
        super(message);
    }
}
public class ThrowTest {
        public static void main(String[] args) throws Exception {
            int a=0;
            int b=1;
            if(a+b==1){
                throw new AddException("cuowu");
            }

        }
}

8、捕获处理异常

  • 捕获处理异常为了明确的取得异常信息,可以直接输出异常类对象,或者调用所有异常类中提供的printStackTrace()方法进行完整异常信息的输出。
    try语句三种形式
  • try 代码块中放的是可能出现异常的代码.
  • catch 代码块中放的是出现异常后的处理行为.
  • finally 代码块中的代码用于处理善后工作, 会在最后执行.
    其中 catch 和 finally 都可以根据情况选择加或者不加.
  • (1)try…catch,捕获处理异常
    一旦 try 中出现异常, 那么 try 代码块中的程序就不会继续执行, 而是交给 catch 中的代码来执行. catch执行完毕会继续往下执行.
public class ThrowTest {
    public static void main(String[] args) {
        System.out.println("1.数学计算开始前");
        try {
            System.out.println("2.进行数学计算:" + 10 / 0);
        } catch (ArithmeticException e) {
            System.out.println("已处理");
        }
        System.out.println("3.数学计算结束后");
    }
}
结果:
异常语句出现的顺序不确定
java.lang.ArithmeticException: / by zero
1.数学计算开始前
3.数学计算结束后
at TestSummary3.ThrowTest.main(ThrowTest.java:12)

1.数学计算开始前
已处理
3.数学计算结束后

(2)try…catch…finally可以有多个catch

public class ThrowTest {
        public static void main(String[] args) {
            System.out.println("[1].数学计算开始前");
            try {
                System.out.println("[2].进行数学计算:" + 10 / 0);
            } catch (ArithmeticException e) {
                e.printStackTrace();
            } finally {
                System.out.println("[Finally]不管是否产生异常,都执行此语句");
            }
            System.out.println("[3].数学计算结束后");
        }
}
结果:
[1].数学计算开始前
java.lang.ArithmeticException: / by zero
[Finally]不管是否产生异常,都执行此语句
	at TestSummary3.ThrowTest.main(ThrowTest.java:12)
[3].数学计算结束后

9、throws和throw关键字

  • thorw是直接编写在语句之中,表示人为进行异常的抛出。如果现在异常类对象实例化不希望由JVM产生而由用户产生,就可以使用throw来完成
    throw和throws的区别
  1. throw用于方法内部,主要表示手工异常抛出。
  2. throws主要在方法声明上使用,明确告诉用户本方法可能产生的异常,同时该方法可能不处理此异常。但是在主类中会处理该异常

10、抛出异常

(1)Java虚拟机自动抛出异常,比如除数为0,抛出java.long.ArithmeticException
(2)程序代码抛出异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值