异常的处理机制trytrytry

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」。

茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

愿你在未来的日子,保持热爱,奔赴山海!

题记:昨天我们已经了解部分的异常的处理机制,接下来就让我们继续一起看下在Java中其他形式去处理异常,Java的异常处理机制!

😮异常的处理机制(重点)

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

异常处理

🐉 捕获异常try 、finally 、catch

这三个关键字主要有下面几种组合方式try-catchtry-finallytry-catch-finally

注意:catch语句可以有一个或者多个或者没有,finally至多有一个,try必要有。

那这里你会问有没有单独try模块出现,那我想问下你,try是用来监听是否有异常,那如果发生了异常,谁来捕获呢?所以没有try单独出现。而且编译不能通过。

所以跟try模块一样,例如catch,finally也不能单独使用出现

  • 程序通常在运行之前不报错,但是运行后可能会出现某些未知的错误,不想异常出现导致程序终止,或者不想直接抛出到上一级,那么就需要通过try-catch等形式进行异常捕获,之后根据不同的异常情况来进行相应的处理。
  • 捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。

捕获异常语法如下:

🔴今天我们先讲解 try-catch 形式:

try{
     编写可能会出现异常的代码
}catch(异常类型  e){
     处理异常的代码
     //记录日志/打印异常信息/继续抛出异常
}
复制代码

例如:

public class TryCatchDemo {
    public static void main(String[] args) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            //当产生异常时,必须有处理方式。要么捕获,要么声明。
            Date date = simpleDateFormat.parse("2020-10-06");
        } catch (ParseException e) {// 括号中需要定义什么呢?
            //try中抛出的是什么异常,在括号中就定义什么异常类型
            e.printStackTrace();//记录日志/打印异常信息/继续抛出异常
        }
        /*
             public Date parse(String source) throws ParseException{}
             //parse抛出了ParseException异常
             public class ParseException extends Exception {}
         */
    }
}
复制代码

如何获取异常信息:

Throwable类中定义了一些查看方法:

  • public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
  • public String toString():获取异常的类型和异常描述信息。
  • public void printStackTrace():打印异常的跟踪栈信息并输出到控制台。
  • 具体我们可以来看下:
public class TryCathDemo2 {
 public static void main(String[] args) {
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
     try {
         //当产生异常时,必须有处理方式。要么捕获,要么声明。
         //演示下获取异常信息,修改了格式。
         Date date = simpleDateFormat.parse("2020年10月06");
     } catch (ParseException e) {
         //public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因
         System.out.println(e.getMessage());//Unparseable date: "2020年10月06"
         System.out.println(e.toString());//java.text.ParseException: Unparseable date: "2020年10月06"
         e.printStackTrace();//输出信息而且飘红!!!
         /*
         java.text.ParseException: Unparseable date: "2020年10月06"
             at java.text.DateFormat.parse(DateFormat.java:366)
             at com.it.test3.TryCathDemo2.main(TryCathDemo2.java:13)
          */
     }
 }
}
复制代码

而如果有多个异常使用捕获我们又该如何处理呢?

  1. 多个异常分别处理。
  2. 多个异常一次捕获,多次处理。

一般我们是使用一次捕获多次处理方式,格式如下:

try{
     编写可能会出现异常的代码
}catch(异常类型A  e){  当try中出现A类型异常,就用该catch来捕获.
     处理异常的代码
     //记录日志/打印异常信息/继续抛出异常
}catch(异常类型B  e){  当try中出现B类型异常,就用该catch来捕获.
     处理异常的代码
     //记录日志/打印异常信息/继续抛出异常
}
复制代码

例如:

public class TryCatchDemo3 {
    public static void main(String[] args) {
        //test();
        test2();
    }
​
    //多个异常一次捕获,多次处理。
    public static void test2(){
        int[] arr = {11, 22, 66, 0};
        try {
            //System.out.println(arr[5]);//一旦这个报错,下面的代码就不会执行
            System.out.println(arr[2]);
            System.out.println(arr[0] / arr[arr.length-1]);
        } catch (ArithmeticException e) {
             System.out.println("除数不为0");
        }catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组下标越界");
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
​
    //分别处理的方式
    public static void test() {
        int a = 10;
        int b = 0;
​
        try {
            System.out.println(a / b);
        } catch (ArithmeticException e) {
            System.out.println("除数不为0");//除数不为0
        }
​
        int[] arr = {1, 2, 3};
        try {
            System.out.println(arr[4]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组下标越界");//数组下标越界
        }
    }
}
复制代码

注意:一次捕获,多次处理的异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

例如:

🌸总结

相信各位看官都对异常处理机制的概念有了充分的了解吧,明天我们继续讲解try的其他形式吧!,那我们继续期待下一章的异常更多的内容吧!欢迎期待下一章的到来!

让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!

学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!

感谢各位看到这里!愿你韶华不负,青春无悔!

\