注:本人学习的传智播客风清扬老师——刘意老师的java基础视频(讲的特别详细)
1、JVM默认处理异常,虽然打印的信息很详细,但是发生异常之后,程序结束运行,异常后面的代码不会执行到。
2、try{ }里面的代码越少越好:因为:可能出现异的代码放到try{}里面,放到try{}的代码就要走异常处理机制,JVM就要开辟新的资源来管理她,因此try{}里的代码越多,占用的资源就越多。
3、catch()里面必须有内容,负责就把异常给隐藏掉了
- public class ExceptionDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8 ;
- // int b = 2 ;
- int b = 0 ;
- System.out.println(a/b);
- System.out.println("over");
- }
- }
复制代码
这个例子为异常程序,看控制台的打印信息,为JVM默认处理。
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.crg_01.ExceptionDemo.main(ExceptionDemo.java:10)
自己try{}catch(){}处理
- public class ExceptionDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8 ;
- // int b = 2 ;
- int b = 0 ;
- try{
- System.out.println(a/b);
- }catch(ArithmeticException e){
- System.out.println("除数不能为0");
- }
-
- System.out.println("over");
- }
- }
复制代码
程序发生异常后,会打印处理信息,并且执行后面的代码。打印出“over”:
除数不能为0
over
4、一个异常的处理
try{}catch(){}
两个异常的同时处理
try{}catch(){
}catch(){} 例子:
- package com.crg_01;
- public class ExceptionDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8;
- // int b = 2 ;
- int b = 0;
- int[] arr = { 1, 2, 3 };
- try {
- System.out.println(arr[3]);
- System.out.println(a / b);
- } catch (ArithmeticException e) {
- System.out.println("除数不能为0");
- } catch (ArrayIndexOutOfBoundsException e) {
- System.out.println("数组越界");
- }
- System.out.println("over");
- }
- }
复制代码
执行结果:
数组越界
over
5、注意:一旦try{}里面出了问题,就会在这里把问题抛出去,然后和catch()的异常进行匹配,一旦有匹配就执行catch(){。。。}里面的处理,然后结束try{}catch(){。。。。},继续执行后面的语句,特别注意:即便try{。。。。}有多调语句或者多条有异常的语句,只要有一条出现问题,并且匹配,其余的语句就不会执行。指的是try{}里面的其他语句。
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8;
- // int b = 2 ;
- int b = 0;
- int[] arr = { 1, 2, 3 };
- try {
- System.out.println(a / b);
- System.out.println(arr[3]);
- } catch (ArithmeticException e) {
- System.out.println("除数不能为0");
- } catch (NullPointerException e) {
- System.out.println("数组越界");
- }
- System.out.println("over");
- }
- }
复制代码
打印信息:
除数不能为0
over
例子:- package com.crg_01;
- public class ExceptionDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8;
- // int b = 2 ;
- int b = 0;
- int[] arr = { 1, 2, 3 };
- try {
- System.out.println(arr[3]);
- System.out.println(a / b);
- } catch (ArithmeticException e) {
- System.out.println("除数不能为0");
- } catch (NullPointerException e) {
- System.out.println("数组越界");
- }
- System.out.println("over");
- }
- }
复制代码
分析:会执行try{}的第一句:System.out.println(arr[3]); 但是没有匹配的异常处理,就相当于没有处理异常,打印异常信息,结束程序执行。(JVM)默认处理。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.crg_01.ExceptionDemo.main(ExceptionDemo.java:13)
在看个例子:
- package com.crg_01;
- public class ExceptionDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8;
- // int b = 2 ;
- int b = 0;
- int[] arr = { 1, 2, 3 };
- try {
- System.out.println(arr[3]);
- System.out.println(a / b);
- } catch (ArithmeticException e) {
- System.out.println("除数不能为0");
- } catch (ArrayIndexOutOfBoundsException e) {
- System.out.println("数组越界");
- }
- System.out.println("over");
- }
- }
复制代码
打印信息:
数组越界
over 这几个例子对比着看,一目了然。
6.如果不知道异常是谁,用Exception处理,Exception是所有异常的父类。
- package com.crg_01;
- public class ExceptionDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8;
- // int b = 2 ;
- int b = 0;
- int[] arr = { 1, 2, 3 };
- try {
- System.out.println(arr[3]);
- System.out.println(a / b);
- System.out.println("如果不知道异常是谁?");
- } catch (ArithmeticException e) {
- System.out.println("除数不能为0");
- } catch (ArrayIndexOutOfBoundsException e) {
- System.out.println("数组越界");
- }catch(Exception e){
- System.out.println("出问题了");
- }
- System.out.println("over");
- }
- }
复制代码
打印信息:
数组越界
over
- package com.crg_01;
- public class ExceptionDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8;
- // int b = 2 ;
- int b = 0;
- int[] arr = { 1, 2, 3 };
- try {
- System.out.println(arr[3]);
- System.out.println(a / b);
- System.out.println("如果不知道异常是谁?");
- } catch (Exception e) {
- System.out.println("出问题了");
- }
- System.out.println("over");
- }
- }
复制代码
打印信息:
出问题了
over
注意:1、能明确尽量用明确的异常处理,2、是在明确不了的,用exception 3、平级关系异常,谁在前后无所谓,子父关系,必须是子在前,父在后。父必须在最后面。
7、JDK7的新特性:多个异常写在一个catch(。。。|。。。。。。){}里面;
- package com.crg_01;
- public class ExceptionDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a = 8;
- // int b = 2 ;
- int b = 0;
- int[] arr = { 1, 2, 3 };
- try {
- System.out.println(arr[3]);
- System.out.println(a / b);
- System.out.println("如果不知道异常是谁?");
- } catch (ArrayIndexOutOfBoundsException | ArithmeticException e) {
- System.out.println("出问题了");
- }
- System.out.println("over");
- }
- }
复制代码
注意:这个方式虽然简洁,但是不合理处(1)处理方式是一致的,符合实际开发的,多个异常,同一个处理(2)多个异常间必须是平级关系。 |
|