zoukankan      html  css  js  c++  java
  • Java trycatch异常相关(part1)

    1.异常概述

    异常就是程序在运行时出现的不正常情况。

    异常的由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常的情况进行描述之后的对象的体现。

    对于问题的划分:

    1-严重的问题, java用Error来进行描述。

    就比如你的文件名是A.java,你却javac B.java,编译器都找不到public class B当然就Error了。

    对于Error,一般不去编写针对性的代码对其进行处理。

    2-非严重的问题,java用Exception来进行描述。

    这类问题不是致命的,还能抢救下。

    对于Exception可以使用针对性的处理方式进行处理。

     举个栗子就是,一个人肝癌晚期和普通感冒的区别。

    无论Error还是Exception都具有一些共性内容,比如不正常的信息,引发原因等。所以说向上抽取:

    Throwable

    |--Error

    |--Exception

    2.try-catch

    Java提供了特有的语句进行处理。

     1 try
     2 {
     3       //需要被检测的代码
     4 }
     5 catch(异常类 变量)
     6 {
     7      //处理异常的代码(处理方式)
     8 }
     9 finally
    10 {
    11      //一定会执行的语句
    12 }

    在try里面进行检测的代码如果出现异常,会将此异常包装成一个类然后传递到catch里面,然后catch里面对其进行处理。

    一个栗子:

     1 class Demo {
     2     int div(int a, int b) {
     3         return a / b;
     4     }
     5 }
     6 
     7 class ExceptionDemo {
     8     public static void main(String args[]) {
     9         Demo d =new Demo();
    10         try
    11         {
    12             int x=d.div(4,0);
    13             System.out.print("x="+x);
    14         }catch (Exception e)
    15         {
    16             System.out.println("除数是零!");
    17             System.out.println(" 信息1:"+e.getMessage());
    18             //输出异常信息
    19             System.out.println("信息2:"+e.toString());
    20             //输出 异常名称:异常信息
    21             e.printStackTrace();
    22             //异常名称、异常信息、异常出现的位置,
    23             //其实Jvm默认的异常处理机制就是在调用printStackTrace方法,
    24             //打印异常的堆栈的跟踪信息
    25         }
    26         System.out.println("over");
    27     }
    28 }

    但是这么写是不Ok的,因为你把功能写出来,你并不知道别人往里面传的是什么参数,你也不知道这个功能会不会发生问题。

    所以我们在写功能的时候,就需要考虑下这个玩意可能出现什么问题并表示出来,在功能上通过throws关键字声明该功能有可能会出现问题

    3.throws关键字

    1 int div(int a, int b) throws Exception{
    2         return a / b;
    3     }

    在函数上声明异常,便于提高安全性,让调用者进行处理,不处理编译失败。

    对多异常处理:

    1.声明异常时,建议声明更为明确的具体的异常,这样处理的可以更具体。

     1 class Demo
     2 {
     3     int div(int a, int b) throws ArrayIndexOutOfBoundsException, ArithmeticException
     4     {
     5         int[] arr=new int[a];
     6         System.out.println(arr[4]);
     7         return a / b;
     8     }
     9 
    10 }
    11 
    12 class ExceptionDemo
    13 {
    14     public static void main(String args[])
    15     {
    16         Demo d = new Demo();
    17         try
    18         {
    19             int x = d.div(5, 0);
    20             System.out.println("x=" + x);
    21         } catch (ArithmeticException e)
    22         {
    23             System.out.println(e.toString());
    24             System.out.println("除数为零!");
    25         } catch (ArrayIndexOutOfBoundsException e)
    26         {
    27             System.out.println(e.toString());
    28             System.out.println("角标越界!!");
    29         }
    30         System.out.println("over!!");
    31     }
    32 }

    功能抛了几个异常就应该有几个对应的相应的catch。如果出现了其他问题,我们不应该再去处理这个问题,而是应该停掉程序,以便定位问题。

    如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

    4.自定义异常与throw关键字

    因为项目会出现特有的问题,而这些问题并未被Java所描述并封装对象。

    所以对于这些特有的问题可以按照Java的对问题封装的思想将特有的问题进行自定义的异常封装,

    也就是自定义异常。

     1 //新要求:程序传入0和负数均抛出异常。
     2 class FuShuExcption extends Exception
     3 {
     4     FuShuExcption(String msg)
     5     {
     6         super(msg);//因为父类中已经把异常信息的操作都完成了,
     7                    //所以子类只要在构造时,将异常信息通过super()传递给父类,
     8                    //那么就可以直接通过getMessage方法获取自定义的异常信息。
     9     }
    10 }
    11 
    12 class Demo
    13 {
    14     int div(int a, int b) throws ArithmeticException, FuShuExcption
    15     {
    16         if (b < 0)
    17         {
    18             throw new FuShuExcption();
    19 
    20         }
    21         return a / b;
    22     }
    23 
    24 }
    25 
    26 class ExceptionDemo
    27 {
    28     public static void main(String args[])
    29     {
    30         Demo d = new Demo();
    31         try
    32         {
    33             int x = d.div(5, 0);
    34             System.out.println("x=" + x);
    35         } catch (ArithmeticException e)
    36         {
    37             System.out.println(e.toString());
    38             System.out.println("除数为零!");
    39         } catch (ArrayIndexOutOfBoundsException e)
    40         {
    41             System.out.println(e.toString());
    42             System.out.println("角标越界!!");
    43         }
    44         System.out.println("over!!");
    45     }
    46 }

    自定义异常就是让你的异常去继承Exception。那为啥要继承Exception呢?

    异常体系有一个特点:因为异常类和异常对象都要被抛出,都具有可抛性,这个是Throwable这个体系中的独有特点。只有这个体系中的类和对象才可以被throw和throws操作。

    当在函数内部出现了throw抛出异常对象,那么必须要给对应的处理动作,要么在内部try-catch处理,要不就在函数上让声明让调用者处理。

    一般情况下,函数内出现异常,函数上需要声明。

    5.throw和throws的区别

    ①throws使用在函数上,throw使用在函数内。

    ②throw后面跟的是异常类,可以跟多个,用逗号隔开。throws后面跟的是异常对象。

    6.RunTimeException

    Exception中有一个特殊的子类异常RunTimeException运行时异常。

    对于异常分两种:

    编译时被检测的异常和编译时不被检测的异常(运行时异常,RunTimeException及其子类)。

    如果在函数内抛出了该异常,函数上可以不用声明,编译一样通过。

    如果在函数上声明了该异常,调用者可以不用进行处理,编译一样能过.

    之所以不用在函数声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后对代码进行修正。

    自定义异常:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RunTimeException。

  • 相关阅读:
    在Ubuntu-20.04上安装Emacs-27.1
    VSCode 配置 C++ 与 python 编译环境
    cf 1557(div2)
    2021牛客暑期多校训练营8
    2021牛客暑期多校训练营7
    2021暑期cf加训3
    2021牛客暑期多校训练营6
    2021牛客暑期多校训练营5
    3ds Max基本操作
    renren-generator快速生成你搬砖需要的CRUD代码的框架
  • 原文地址:https://www.cnblogs.com/KangYh/p/9791102.html
Copyright © 2011-2022 走看看