A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大蓝鲸Java 中级黑马   /  2019-7-19 12:01  /  455 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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("录入正确");
    }
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马