java异常处理

2022-10-25 17:56:19 浏览数 (2)

java异常处理

我们在编程过程中或多或少遇见过错误,这些错误用官方术语来说就称为异常

什么是异常

异常是指程序运行过程中出现的不期而遇的各种状况,影响了正常的程序执行流程

异常的分类

异常分为以下三种:

  • 检查型异常:用户错误或问题引起的异常,是程序员无法预见的(例如打开一个不存在的文件)
  • 运行时异常:最可能被程序员避免的异常
  • 错误:错误不属于异常,是脱离程序员控制的问题,在代码中常常被忽略(例如栈的溢出)

异常体系结构

java把异常当作对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的超类

在javaAPI中已经定义了许多异常类,这些异常类分为两大类:错误Error和异常Exception

然后为大家附上异常体系结构图:

Error和Exception

Error特征:

  • Error类对象由java虚拟机生成并抛出,大多数错误与代码编写者无关
  • java虚拟器运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常出现时,一般选择线程终止
  • 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError),连接错误(LinkageError)。这些错误不可查,因为它们在应用程序的控制和处理能力之外,而且绝大部分时程序运行时不允许出现的状况

Exception特征:

  • 运行时异常是不检查异常,程序中可以选择捕获处理也可以选择不处理
  • 这些异常一般是由程序错误引起的,程序应该从逻辑角度尽量避免这些异常的出现

两者的区别:

  • Error常常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,JVM一般选择直接终止线程
  • Exception常常是可以被程序处理的,并且在程序中应该尽量去处理这些异常

捕获,抛出异常

针对异常有两种处理方式

  • try,catch,finally
  • throw,throws

首先针对try:

一般格式为:

代码语言:javascript复制
 try {
           执行代码
        }catch (异常类型 e){
            执行失败后代码
        }finally {
            必定执行代码
        }

例子:

代码语言:javascript复制
public class Demo1 {

    public static void main(String[] args) {

        int a = 1;
        int b = 0;

        //try尝试,catch捕捉,finally最终实现
        try {
            System.out.println(a/b);
        }catch (ArithmeticException e){
            System.out.println("被除数为0");
        }finally {
            System.out.println("运行结束");
        }
    }
}

这里注意:catch可以有多层,一般从小异常到大异常

代码语言:javascript复制
public class Demo2 {

    public static void main(String[] args) {

        int a = 1;
        int b = 0;

        //try尝试,catch捕捉,finally最终实现
        try {
            System.out.println(a/b);
        }catch (Error e){
            System.out.println("Error");
        }catch (ArithmeticException e){
            System.out.println("ArithmeticException");
        }catch (Throwable e){
            System.out.println("Throwable");
        }finally {
            System.out.println("finally ");
        }
    }
}

再来说说throw:

一般格式:

代码语言:javascript复制
throw new 异常类型();

例子:

代码语言:javascript复制
public class Demo3 {

    public static void main(String[] args) {

        int a = 1;
        int b = 0;

        //主动抛出异常
        if (b == 0) {
            throw new ArithmeticException();
        }
    }
}

throw一般用于方法中:

代码语言:javascript复制
public class Demo4 {
    public static void main(String[] args) {

        try{
            new Demo4().test(1,0);
        }catch(ArithmeticException e){
            e.printStackTrace();
        }
    }

    //若方法处理不了异常,方法上抛出异常
    public void test(int a,int b) throws ArithmeticException{
        if(b == 0){
            //主动抛出异常,一般在方法中使用
            throw new ArithmeticException();
        }
    }
}

针对异常处理有快捷键:

代码语言:javascript复制
ctrl Alt T

在这里我们补充一下printStackTrace

printStackTrace的作用是为了展示出错行数,一般用于调试

代码语言:javascript复制
public class Demo5 {

    public static void main(String[] args) {

        int a = 1;
        int b = 0;

        //try尝试,catch捕捉,finally最终实现
        try {
            System.out.println(a/b);
        }catch (ArithmeticException e){
            e.printStackTrace();
        }finally {
            System.out.println("运行结束");
        }
    }
}

结果:

代码语言:javascript复制
java.lang.ArithmeticException: / by zero
	at error.Demo5.main(Demo5.java:12)
运行结束

在idea中由软件给出,但在记事本或其他软件中需要printStackTrace得出错误行数便于纠正修改

实际应用中的经验总结

  • 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch来处理
  • 在多重catch块后面,可以加上一个catch(Exception)来处理可能会被遗漏的异常
  • 对于不确定的代码,也可以加上try-catch处理潜在异常
  • 尽量去处理异常,切忌只是简单的调用printStackTrace()去打印输出
  • 具体如何处理异常,要根据不同的业务需求和异常类型去处理
  • 尽量添加finally语句块去释放占用的资源

结束语

好的,关于java异常先简单介绍到这里

0 人点赞