栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

人生在世,谁敲代码碰不上几个异常呢------异常的分类和处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

人生在世,谁敲代码碰不上几个异常呢------异常的分类和处理

目录

概念:

异常的处理方式

try...catch...finally 

 异常中需要掌握的方法

getMessage()

 toString()

 printStackTrace()

 抛出


概念:

异常:用咱们老家的一句话来说就是,Java程序里面跑啊跑,跑啊跑,跑到一半,pia!出问题了,强制停止了,跑不下去了,芭比Q了,附上一张表情包

 而异常可以分为以下爱的几类:Throwable;Error;Exception;RuntimeException,具体的关系如下图所示

                         

 这张图,就讲解的十分完美,

Throwable是所有异常的父类

Error是一个比较,不,是十分严重的问题(打一个不恰当的例子,你约会约到一半,外星人给你捉走了,这是你不能够立马解决的问题)。所以这个问题我们暂时不研究

Exception,这个异常,我们可以研究:这个异常可以分为一下几类:

                1、运行时异常:RuntimeException,这样的问题我们也不处理,因为这样类似的问题 一般情况下都是由于你的代码不够严谨导致的。

                2、编译时期异常: 除了不是RuntimeException的,都是编译时期异常,必须要处理,如果你不处理 编译不通过,无法运行。

        如果程序出现了一个问题,而我们没有做任何的处理,Java虚拟机JVM就会给一个默认的处理方式------------把异常类的名称,相关的原因,以及出现问题的相关信息和位置信息输出在控制台,同时 java程序会结束,后面的代码不会执行。

异常的处理方式

        1、try...catch...finally

        2、throws

try...catch...finally 

        处理格式

try{

        可能会出现问题的代码;

}catch(异常的类名 变量名){

        针对问题的一些处理       

}finally{

        不管报不报错都会执行的代码(一般情况下,这里都会放一些释放资源的代码)

}

public class Demo {
    public static void main(String[] args) {
        //你要想解决异常,首先你是不是得先得写一个异常,所以,宝贝们,接下来就写一个异常吧
        int a = 10;
        int b = 0;
        //ArithmeticException: / by zero  除数不能为零异常
//        System.out.println(a / b);
        try {
            System.out.println(a / b);
        }catch (ArithmeticException e){
            System.out.println("除数不能为零");
        }finally {
            System.out.println("不管上面是啥报错,这里的内容都是会执行的");
        }
    }
}

运行结果:

变形格式

try{

        可能会出现问题的代码;

}catch(异常的类名 变量名){

        针对问题的一些处理       

}

public class Demo {
    public static void main(String[] args) {
        //你要想解决异常,首先你是不是得先得写一个异常,所以,宝贝们,接下来就写一个异常吧
        int a = 10;
        int b = 0;
        //ArithmeticException: / by zero  除数不能为零异常
//        System.out.println(a / b);
        try {
            System.out.println(a / b);
        }catch (ArithmeticException e){
            System.out.println("除数不能为零");
        }
    }
}

运行结果:

处理多个异常的格式

try{

         可能会出现问题的代码1;

        可能会出现问题的代码2;

}catch(异常的类名1 变量名1){        

        针对问题的一些处理;

}catch(异常的类名2 变量名2){

        针对问题的一些处理;

}

         多个异常处理中多个catch的注意事项

                1、能明确异常类型的时候,尽量要明确类型、不要用父类做处理

                2、catch和catch之间的异常是平级关系,多个catch异常之间没有先后顺序,一旦出现了一个父类继承关系的时候父类必须在最后面

                3、一但try里面的代码出现了问题,就会去匹配catch里面的异常,继续执行程序try...catch...后面的代码,try里面的额代码就停在了报错的那一步。

public class Demo {
    public static void main(String[] args) {
        //你要想解决异常,首先你是不是得先得写一个异常,所以,宝贝们,接下来就写一个异常吧
        int a = 10;
        int b = 0;

        int[] arr = {1,2,3,4};
        //ArithmeticException: / by zero  除数不能为零异常
//        System.out.println(a / b);

        //ArrayIndexOutOfBoundsException 地址下标越界异常
//        System.out.println(arr[4]);
        try {
            System.out.println("hello");
            System.out.println(a / b);
            System.out.println(arr[4]);
        }catch (ArithmeticException e){
            System.out.println("除数不能为零");
        }catch (ArrayIndexOutOfBoundsException f){
            System.out.println("地址下标不能越界");
        }
    }
}

运行结果:

 重点来了:!!!

JDK1.7之后针对多个异常处理新的处理方式:

try{
    可能会出现问题的代码;
}catch(异常类名1 | 异常类名2 | ...  变量名){
    处理异常的提示;
}

 注意:

1、处理方式是一致的,这个方法虽然比较简洁,但是不够好,针多种类型的问题, 只给出了一种解决方案

2、catch中多个异常类型之间的关系必须是平级关系,不能存在继承关系

public class Demo {
    public static void main(String[] args) {
        //你要想解决异常,首先你是不是得先得写一个异常,所以,宝贝们,接下来就写一个异常吧
        int a = 10;
        int b = 0;

        int[] arr = {1,2,3,4};
        //ArithmeticException: / by zero  除数不能为零异常
//        System.out.println(a / b);

        //ArrayIndexOutOfBoundsException 地址下标越界异常
//        System.out.println(arr[4]);
        try {
            System.out.println("hello");
            System.out.println(a / b);
            System.out.println(arr[4]);
        }catch (ArithmeticException | ArrayIndexOutOfBoundsException f){
            System.out.println("有错误");
        }
    }
}

 运行结果:

 异常中需要掌握的方法

        getMessage()    获取异常信息,返回字符串

        toString()     获取异常类名和异常信息,返回字符串

        printStackTrace()     获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void

getMessage()

 toString()

        看结果不难看出toString()里面的输出结果含有getMessage(),所以进原码我们可以看见toString()含有getMessage()【看原码:按住Ctrl左键点击要看的东西】

 

 printStackTrace()

 

 抛出

在今后的开发中,有些时候我们根本没有权限去做一些异常的处理,或者说我们根本就处理不了,所以干脆就别处理了,为了解决这样的问题,并且还能保证程序正常运行的情况下,java针对这种情况,提供了另外一个解决异常的方式:throws抛出(跟在方法后面)

格式:

throws 异常类名
在哪里写呢?在方法小括号后面,左大括号之前

注意事项:

 1、main方法上个尽量不要进行异常抛出,因为程序会停止,后面代码不会执行 

2、编译时期的异常抛出,方法内部不需要做处理,是由将来调用该方法的调用者处理

3、运行时期异常可以不抛出,但是一旦调用,出错后,后面的代码依旧不会执行

4、最好抛出一个具体的异常类型,也是推荐这么做的,可以抛出多个异常,用逗号隔开

 异常注意事项:

1、子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)

2、如果父类抛出了多个异常,子类重写父类时, 只能抛出相同的异常或者是他的子集,子类不能单独抛出父类没有的异常

3、如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常, 如果子类方法内有编译时期异常发生,那么子类只能try,不能throws

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678026.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号