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