黑马程序员技术交流社区
标题:
【南京校区】异常体系
[打印本页]
作者:
大蓝鲸Java
时间:
2019-7-19 12:01
标题:
【南京校区】异常体系
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("录入正确");
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2