码迷,mamicode.com
首页 > 编程语言 > 详细

Java的动手动脑(六)

时间:2018-11-08 18:32:23      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:code   info   col   导致   日期   ane   理由   区别   port   

 

日期:2018.11.8

星期四

博客期:022

-----------------------------------------------------------------------------------------

  Part 1: 基本异常处理

技术分享图片
 1 package teacher;
 2 
 3 import javax.swing.*;
 4 
 5 class AboutException {
 6    public static void main(String[] a) 
 7    {
 8       int i=1, j=0, k;
 9       k=i/j;
10 
11 
12     try
13     {
14         
15         k = i/j;    // Causes division-by-zero exception
16         throw new Exception("Hello.Exception!");
17     }
18     
19     catch ( ArithmeticException e)
20     {
21         System.out.println("被0除.  "+ e.getMessage());
22     }
23     
24     catch (Exception e)
25     {
26         if (e instanceof ArithmeticException)
27             System.out.println("被0除");
28         else
29         {  
30             System.out.println(e.getMessage());
31             
32         }
33     }
34 
35     
36     finally
37      {
38              JOptionPane.showConfirmDialog(null,"OK");
39      }
40         
41   }
42 }
AboutException.java

  运行结果如下:

技术分享图片

  说明:因为当你的程序出现错误的时候,即第一个 k = i / j ;语句执行的时候,你的程序运行到这里就结束(中断)了,不可能继续运行try{}里的 k = i / j ;语句,所以会是这个结果!而当你将它的第一个 k = i / j; 用//或/**/注释掉之后 ,运行结果如下:

技术分享图片

  在你注释掉了以后,它会继续执行try{}里的 k = i / j ;语句,也就会在try{}里抛出 ArithmeticException ,而后边刚好有catch 语句接到了,进而做了内部处理,由于 ArithmeticException 已经得到了 catch,后面的 catch (Exception e) 就没有接到,于是不执行,而后面的finally除了特殊情况,一般是要执行的,于是便是这样的结果!但如果你把第二个 k = i / j; 也用//或/**/注释掉之后,运行结果如下:

技术分享图片

  理由很清晰,就是根据类型执行catch 语句和 finally 语句!

-----------------------------------------------------------------------------------------

  Part 2: 多层的异常捕获(1+2)

技术分享图片
 1 package teacher;
 2 
 3 public class CatchWho { 
 4     public static void main(String[] args) { 
 5         try { 
 6                 try { 
 7                     throw new ArrayIndexOutOfBoundsException(); 
 8                 } 
 9                 catch(ArrayIndexOutOfBoundsException e) { 
10                        System.out.println(  "ArrayIndexOutOfBoundsException" +  "/内层try-catch"); 
11                 }
12  
13             throw new ArithmeticException(); 
14         } 
15         catch(ArithmeticException e) { 
16             System.out.println("发生ArithmeticException"); 
17         } 
18         catch(ArrayIndexOutOfBoundsException e) { 
19            System.out.println(  "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 
20         } 
21     } 
22 }
CatchWho.java
技术分享图片
 1 package teacher;
 2 
 3 public class CatchWho2 { 
 4     public static void main(String[] args) { 
 5         try {
 6                 try { 
 7                     throw new ArrayIndexOutOfBoundsException(); 
 8                 } 
 9                 catch(ArithmeticException e) { 
10                     System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch"); 
11                 }
12             throw new ArithmeticException(); 
13         } 
14         catch(ArithmeticException e) { 
15             System.out.println("发生ArithmeticException"); 
16         } 
17         catch(ArrayIndexOutOfBoundsException e) { 
18             System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 
19         } 
20     } 
21 }
CatchWho2.java

  这两段代码的运行截图分别如下:

技术分享图片

技术分享图片

  说明:那我就把这两个案例综合在一起分析吧!首先对比这两个案例!我们可以看到区别,内部try{}里的所要catch的异常不同——ArrayIndexOutOfBoundsException和ArithmeticException,但究竟是什么原因导致了这结果的不同呢?我来说吧!这无外乎就是这一个catch的嵌套比较特殊!因为它两层的嵌套有重复的Exception监听处理,这就产生了另外一个问题——究竟是哪个或哪些部分catch到了异常呢?我们从运行结果中可以得知,catch是就近原则的,而且除了

 

Java的动手动脑(六)

标签:code   info   col   导致   日期   ane   理由   区别   port   

原文地址:https://www.cnblogs.com/onepersonwholive/p/9930040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!