首页技术文章正文

异常体系【黑马java培训】

更新时间:2019年07月26日 10时45分47秒 来源:黑马程序员论坛

1.异常
        今天学的异常,并不是如何处理异常。
        而是当代码出现了异常的时候,我们怎么操作,来保证程序还可以继续运行。

        //姓名 和 年龄
        System.out.println("请输入姓名 ");
        sc.nextLine();

        System.out.println("请输入年龄");
        String ageStr = sc.nextLine();//abc
       
        int age = Integer.parseInt(ageStr);//这一行解析异常


        //当代码出现了异常的时候代码会出现什么情况?
        //1,会把异常信息打印在控制台
        //2,停止虚拟机运行


就会引发一个问题:
        以后我们的代码是在服务器运行。



思考场景:
        百度公司今天早上打开了服务器
        第一个用户开始注册信息:录入了姓名没有问题,录入了年龄错误了,此时服务器崩溃了。

如果真的出现了这样的问题,那么表示这个代码是不靠谱的。
我们想的是什么,不管出现了什么异常,都能让虚拟机正常运行。
这个才是我们今天学习的重点。




2.异常的体系结构:
        Throwable
                Error : 错误。
                                一般不需要我们处理。
                                一般是代码中致命的问题或者是硬件方面的问题。


                Exception : 异常
                                RuntimeException : 运行时异常 --- 就是在java命令时出现的异常
                                                                                                                        当代码运行之后,在控制台会打印异常信息


                                非RuntimeException:编译时异常 --- 就是在javac命令时候出现的异常       
                                                                                                                        在idea中,是以红色波浪线的形式体现


3.JVM默认处理异常的方案:
        a,会把异常信息打印在控制台上
               
               
                Exception in thread "main" //标准理解:异常在main线程中。线程的概念会在多线程的时候学习
                                                                        //现在理解:异常在main方法中。
                java.lang.ArrayIndexOutOfBoundsException: 10//异常的信息。出现了什么异常。


                在   包名                                        类名                方法名          行数
                at com.itheima.demo12.                Demo6.                method        (Demo6.java:14)
                at com.itheima.demo12.                Demo6.                main        (Demo6.java:8)


        b,停止虚拟机的运行,下面的代码不会再执行到了


4.try...catch...

目的:
        当出现异常的时候,不让虚拟机崩溃,可以继续运行。

流程:
        正常情况:
                1.从try语句开始逐行往下执行。
                2.如果一直没有遇到异常,会把try里面所有的代码全部执行完毕,不会执行catch。再执行try...catch体系下面的代码。
        异常情况:
                1.从try语句开始逐行往下执行。
                2.当遇到了异常。此时try下面的代码就不会再执行了。
                  会创建一个异常的对象
                3.拿着这个对象看catch能不能捕获。
                        如果能捕获,执行catch
                        如果不能捕获,直接采取JVM默认处理异常的方式。
       
       
        格式:
                try{
                        //有可能出现异常的代码
                }catch(异常的名字){
                        //如果出现了这样的异常,我们该怎么办?
                }

        注意点:
                1、try里面如果出现了异常,直接跳转到对应的catch语句块中。try下面的代码就不会再执行了。
                2、当出现了异常时候,会执行catch语句,当catch执行完之后,整个的try...catch体系全部执行完毕,此时虚拟机不会停止。
                        继续执行这个体系下面的代码。



        练习1:
                  try {
            int [] arr = {1,2,3};
            System.out.println(arr[10]);
            System.out.println(111);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("出现了异常");
        }
        System.out.println(222);



        练习2:
                  try {
            int [] arr = {1,2,3};
            System.out.println(arr[10]);
            System.out.println(111);
        } catch (Exception e) {
            System.out.println("出现了异常");
        }
        System.out.println(222);


        练习3:
                try {
            int [] arr = {1,2,3};
            System.out.println(arr[10]);//此时会创建 ArrayIndexOutOfBoundsException 这个异常的对象。
            System.out.println(111);
        } catch (NullPointerException e) {//此时是空指针异常,这两个类之间没有继承关系,所以此时不能捕获。
                                                                                        //不能捕获相当于我们对这个异常没有任何处理
                                                                                        //所以虚拟机会采取默认处理方式。
            System.out.println("出现了异常");
        }
        System.out.println(222);

运行结果:直接报错。
       




5.try...catch...这个体系如果想要捕获多个异常怎么办?

        只要写多个catch就可以了。
                 try {
            int [] arr = {1,2,3};
            System.out.println(arr[10]);
            System.out.println(111);
        } catch (NullPointerException e) {
            System.out.println("出现了异常");
        }catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("出现了异常");
        }
        System.out.println(222);

6.在实际开发中写try...catch...的方式
                try {
            int [] arr = {1,2,3};
            System.out.println(arr[10]);
            System.out.println(111);
        }catch (NullPointerException e) {
           //如果出现空指针,我会用处理办法1
        }catch (ArrayIndexOutOfBoundsException e) {
            //如果出现索引越界,我会用处理办法2
        }catch (Exception e) {
            //最后再补一个最大的异常,因为如果出现未知异常,不至于虚拟机停止。
        }
        System.out.println(222);



7.Throwable中的常用方法
        printStackTrace() //就是把异常的信息打印在控制上。
                                                //最全的,也是idea自动生成时默认采取的一种方式。

        //仅仅是把异常信息以红色字体展示在控制上,虚拟机是没有停止的,还是会继续往下执行代码。



        引申:
                ctrl + alt + t 包裹代码。



8.编译时异常和运行时异常
       
        编译时异常:就是在编译的时候出现的异常。
                                在javac的时候出现的异常
                                在idea中是以红色波浪线的形式体现的,不得不处理,否则就无法运行。

        运行时异常:就是在运行的时候出现的异常。
                                在java的时候出现的异常
                                在idea中不是以红色波浪线的形式体现的。在运行时候出现的。



9.throws
        抛给谁?
                抛给调用者处理



10.异常的处理方式:
        两种:try ...catch
                        throws


        什么时候用哪个?
                当你觉得当前代码崩了无所谓,那么就可以使用throws
                当你觉得当前代码不能崩,那么就必须用try ...catch


案例:
        //键盘录入
        //此时录入年龄,必须要是0-120之间
        //如果录错了,我就让他一直录。
public class Demo6 {
    public static void main(String[] args) {
            method();
    }
    public static void method() {

        while(true){
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入age");
            String ageString = sc.nextLine();
            try {
                int ageInt = Integer.parseInt(ageString);
                if(ageInt >= 0 && ageInt <= 120){
                    System.out.println("合法的年龄");
                    break;
                }else{
                    System.out.println("年龄超出范围");
                    continue;
                }
            } catch (NumberFormatException e) {
                System.out.println("请录入一个整数");
               continue;
            }
        }
        System.out.println("录入正确");
    }
}


推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!