黑马程序员技术交流社区

标题: JAVA基础学习-————-IO前奏之异常处理 [打印本页]

作者: jackchen_crg    时间: 2015-8-11 02:38
标题: JAVA基础学习-————-IO前奏之异常处理
注:本人学习的传智播客风清扬老师——刘意老师的java基础视频(讲的特别详细)
1、JVM默认处理异常,虽然打印的信息很详细,但是发生异常之后,程序结束运行,异常后面的代码不会执行到。
2、try{ }里面的代码越少越好:因为:可能出现异的代码放到try{}里面,放到try{}的代码就要走异常处理机制,JVM就要开辟新的资源来管理她,因此try{}里的代码越多,占用的资源就越多。
3、catch()里面必须有内容,负责就把异常给隐藏掉了
  1. public class ExceptionDemo {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 int a = 8 ;
  5. //                int b = 2 ;
  6.                 int b = 0 ;
  7.                 System.out.println(a/b);
  8.                 System.out.println("over");
  9.         }

  10. }
复制代码

这个例子为异常程序,看控制台的打印信息,为JVM默认处理。
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at com.crg_01.ExceptionDemo.main(ExceptionDemo.java:10)
自己try{}catch(){}处理
  1. public class ExceptionDemo {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 int a = 8 ;
  5. //                int b = 2 ;
  6.                 int b = 0 ;
  7.                 try{
  8.                         System.out.println(a/b);
  9.                 }catch(ArithmeticException e){
  10.                         System.out.println("除数不能为0");
  11.                 }
  12.                
  13.                 System.out.println("over");
  14.         }

  15. }
复制代码


程序发生异常后,会打印处理信息,并且执行后面的代码。打印出“over”:
除数不能为0
over

4、一个异常的处理
try{}catch(){}
两个异常的同时处理
try{}catch(){
}catch(){}   例子:
  1. package com.crg_01;

  2. public class ExceptionDemo {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 int a = 8;
  6.                 // int b = 2 ;
  7.                 int b = 0;
  8.                 int[] arr = { 1, 2, 3 };
  9.                 try {
  10.                         System.out.println(arr[3]);
  11.                         System.out.println(a / b);

  12.                 } catch (ArithmeticException e) {
  13.                         System.out.println("除数不能为0");
  14.                 } catch (ArrayIndexOutOfBoundsException e) {
  15.                         System.out.println("数组越界");
  16.                 }

  17.                 System.out.println("over");
  18.         }

  19. }
复制代码



执行结果:
数组越界
over

5、注意:一旦try{}里面出了问题,就会在这里把问题抛出去,然后和catch()的异常进行匹配,一旦有匹配就执行catch(){。。。}里面的处理,然后结束try{}catch(){。。。。},继续执行后面的语句,特别注意:即便try{。。。。}有多调语句或者多条有异常的语句,只要有一条出现问题,并且匹配,其余的语句就不会执行。指的是try{}里面的其他语句。
  1. public static void main(String[] args) {
  2.                 // TODO Auto-generated method stub
  3.                 int a = 8;
  4.                 // int b = 2 ;
  5.                 int b = 0;
  6.                 int[] arr = { 1, 2, 3 };
  7.                 try {
  8.                         System.out.println(a / b);
  9.                         System.out.println(arr[3]);

  10.                 } catch (ArithmeticException e) {
  11.                         System.out.println("除数不能为0");
  12.                 } catch (NullPointerException e) {
  13.                         System.out.println("数组越界");
  14.                 }

  15.                 System.out.println("over");
  16.         }

  17. }
复制代码


打印信息:
除数不能为0
over

例子:
  1. package com.crg_01;

  2. public class ExceptionDemo {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 int a = 8;
  6.                 // int b = 2 ;
  7.                 int b = 0;
  8.                 int[] arr = { 1, 2, 3 };
  9.                 try {

  10.                         System.out.println(arr[3]);
  11.                         System.out.println(a / b);

  12.                 } catch (ArithmeticException e) {
  13.                         System.out.println("除数不能为0");
  14.                 } catch (NullPointerException e) {
  15.                         System.out.println("数组越界");
  16.                 }

  17.                 System.out.println("over");
  18.         }

  19. }
复制代码


分析:会执行try{}的第一句:System.out.println(arr[3]);  但是没有匹配的异常处理,就相当于没有处理异常,打印异常信息,结束程序执行。(JVM)默认处理。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at com.crg_01.ExceptionDemo.main(ExceptionDemo.java:13)

在看个例子:
  1. package com.crg_01;

  2. public class ExceptionDemo {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 int a = 8;
  6.                 // int b = 2 ;
  7.                 int b = 0;
  8.                 int[] arr = { 1, 2, 3 };
  9.                 try {

  10.                         System.out.println(arr[3]);
  11.                         System.out.println(a / b);

  12.                 } catch (ArithmeticException e) {
  13.                         System.out.println("除数不能为0");
  14.                 } catch (ArrayIndexOutOfBoundsException e) {
  15.                         System.out.println("数组越界");
  16.                 }

  17.                 System.out.println("over");
  18.         }

  19. }
复制代码

打印信息:
数组越界
over                 这几个例子对比着看,一目了然。

6.如果不知道异常是谁,用Exception处理,Exception是所有异常的父类。
  1. package com.crg_01;

  2. public class ExceptionDemo {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 int a = 8;
  6.                 // int b = 2 ;
  7.                 int b = 0;
  8.                 int[] arr = { 1, 2, 3 };
  9.                 try {

  10.                         System.out.println(arr[3]);
  11.                         System.out.println(a / b);
  12.                         System.out.println("如果不知道异常是谁?");

  13.                 } catch (ArithmeticException e) {
  14.                         System.out.println("除数不能为0");
  15.                 } catch (ArrayIndexOutOfBoundsException e) {
  16.                         System.out.println("数组越界");
  17.                 }catch(Exception e){
  18.                         System.out.println("出问题了");
  19.                 }

  20.                 System.out.println("over");
  21.         }

  22. }
复制代码


打印信息:
数组越界
over
  1. package com.crg_01;

  2. public class ExceptionDemo {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 int a = 8;
  6.                 // int b = 2 ;
  7.                 int b = 0;
  8.                 int[] arr = { 1, 2, 3 };
  9.                 try {

  10.                         System.out.println(arr[3]);
  11.                         System.out.println(a / b);
  12.                         System.out.println("如果不知道异常是谁?");

  13.                 } catch (Exception e) {
  14.                         System.out.println("出问题了");
  15.                 }

  16.                 System.out.println("over");
  17.         }

  18. }
复制代码


打印信息:
出问题了
over
注意:1、能明确尽量用明确的异常处理,2、是在明确不了的,用exception 3、平级关系异常,谁在前后无所谓,子父关系,必须是子在前,父在后。父必须在最后面。

7、JDK7的新特性:多个异常写在一个catch(。。。|。。。。。。){}里面;
  1. package com.crg_01;

  2. public class ExceptionDemo {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 int a = 8;
  6.                 // int b = 2 ;
  7.                 int b = 0;
  8.                 int[] arr = { 1, 2, 3 };
  9.                 try {

  10.                         System.out.println(arr[3]);
  11.                         System.out.println(a / b);
  12.                         System.out.println("如果不知道异常是谁?");

  13.                 } catch (ArrayIndexOutOfBoundsException | ArithmeticException e) {
  14.                         System.out.println("出问题了");
  15.                 }

  16.                 System.out.println("over");
  17.         }

  18. }
复制代码

注意:这个方式虽然简洁,但是不合理处(1)处理方式是一致的,符合实际开发的,多个异常,同一个处理(2)多个异常间必须是平级关系。
作者: 风华正茂    时间: 2015-8-11 12:37
刘意视频确实不错,很详细




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2