java异常处理

捕获和抛出异常

异常处理的五大关键字:try,catch,finally,throw,throws

1.捕获异常

用法:

​ try{可能会出现异常的代码

​ } catch(Exception e)//catch后面跟想要捕获的异常类型

​ {异常的处理逻辑}

idea快捷键:ctrl+alt+t

eclipse快捷键alt+shift+z

代码示例:

public class Test1 {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        
        try {
            //快捷键ctrl+ait+t选择try
            System.out.println(a/b);
        } catch (ArithmeticException e) {
            System.out.println("算术异常");;
        } finally {
            System.out.println("无论程序是否捕获到异常都会被执行");
        }
    }
}

输出:

算术异常
无论程序是否捕获到异常都会被执行

2.抛出异常

​ 通过throws关键字声明抛出这个异常,交给方法的调用者去处理,在这里main方法的调用者是JVM,即交给JVM去处理。

throw与throws

throws: 跟在方法声明后面,后面跟的是异常类名
throw: 用在方法体内,后面跟的是异常类对象名

throws: throws表示有出现异常的可能性,并不一定出现这些异常
throw: throw则是抛出了异常,执行throw一定出现了某种异常

throws: 表示抛出异常,由该方法的调用者来处理
throw: 表示抛出异常,由该方法体内的语句来处理

throws:后面可以跟多个异常。用逗号(,)隔开
throw:只能抛出一个异常对象名

代码示例:

public class Demo02 {
    //throws后面可以跟多个异常。用逗号(,)隔开
    public static void main(String[] args) throws Exception {
            Demo02 d=new Demo02();
            d.division(5.0,0.0);
    }
    public void division(double x,double y) throws ArithmeticException{//throws后面跟异常类
        double num=x/y;
        if (y==0) {
            throw new ArithmeticException("算术异常");//后面跟异常对象名
        } else {
            System.out.println(num);

        }
    }

    }

输出:

Exception in thread "main" java.lang.ArithmeticException: 算术异常
	at com.exception.Demo02.division(Demo02.java:11)
	at com.exception.Demo02.main(Demo02.java:6)

可以看到当if成立时,会抛出异常,也就是throw才会执行。而当没异常的时候则不会执行!

3.两种处理方式的区别

  1. 抛出异常:如果程序出现了异常,没有办法将具体的异常打印出来,不做任何处理程序中断。
    1. 捕获异常:如果程序出现了异常,就能够详细的打印是什么原因导致了异常并且能够做出相应的处理,能够显示详细的日志,程序不中断。

4.自定义异常

在java中除了,java中给我们定义的异常之外,我们还可以自定义异常。

如何自定义异常:

在进行程序开发的过程中,自定义异常遵循以下四个步骤:

1.首先创建自定义异常类,语法格式:自定义异常类名 extends Exception。
2.在方法中通过关键字throw抛出异常对象。
3.若是在当前抛出异常的方法中处理异常,可以用try-catch语句捕获并处理;若不是,在方法的声明处通过关键字throws指明要抛出给方法调用的异常。
4.在出现异常方法的调用中捕获并理异常

eg:定义一个大于10就会从抛出的异常

//自定义异常类
public class CustomizeException extends Exception{
    private int a;

    public CustomizeException(int a) {
        this.a = a;
    }
    //toString:异常的打印信息
    @Override
    public String toString() {
        return "CustomizeException{"+a+'}';
    }
}

然后书写一个测试类,里面放可能会存在异常的方法

package com.exception;

public class TestCustomizeException {
    //定义一个可能会存在异常的方法
    static void test(int a) throws CustomizeException {
        System.out.println("传递的参数为"+a);
        if (a>10){
            throw new CustomizeException(a);
        }
        System.out.println("ok");
    }

    public static void main(String[] args) {
        try {
            test(11);
        } catch (CustomizeException e) {
            System.out.println("CustomizeException=>"+e);;
        }
    }
}

输出:

传递的参数为11
CustomizeException=>CustomizeException{11}

这就是自定义异常

自定义异常在实际应用中的经验总结

  • 在处理运行时异常的时候,采用逻辑去合理规避同同时辅助try-catch处理
  • 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
  • 对于不确定的代码,也可以加上try-catch处理潜在的异常
  • 尽量去处理异常,而不是只调用PrintStackTrace()去打印输出
  • 具体如何处理异常,要根据不同的业务需求和异常类型去决定
  • 尽量添加finally语句块去释放占用的资源
posted @ 2022-07-15 18:19  星余明  阅读(92)  评论(0编辑  收藏  举报