zoukankan      html  css  js  c++  java
  • 07-异常处理(动手动脑问题)

    一、.异常处理基础

    测试代码一:

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

    运行结果截图:

    因执行 i/j 零作为除数而抛出异常

    测试代码二(使用JAVA异常处理机制):

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

    执行结果:

    JAVA异常处理:

    1.捕获语句:

    Try{                                          

                  //可能发生运行错误的代码;
    }                                              
          catch(异常类型 异常对象引用){
         //用于处理异常的代码
    }                                             
    finally{                                     
     //用于“善后” 的代码
    }                                             

     2.异常处理机制:

    • 把可能会发生错误的代码放进try语句块中。
    • 当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。
    • catch语句块中的代码用于处理错误。
    • 当异常发生时,程序控制流程由try语句块跳转到catch语句块。
    • 不管是否有异常发生,finally语句块中的语句始终保证被执行。
    • 如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。

    二、多层异常捕获:

    测试代码一:

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

    执行结果:

    测试代码二:

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

    执行结果:

    原因分析:

    JAVA异常处理流程:

    (1)如果程序中产生了异常,那么JVM根据异常的类型,实例化一个指定异常类的对象;

    (2)如果这时程序中没有任何的异常处理操作,则这个异常类的实例化对象将交给JVM进行处理,而JVM的默认处理方式就是进行异常信息的输出,而后中断程序执行;

    (3)如果程序中存在了异常处理,则会由try语句捕获产生的异常类对象;

    (4)与try之后的每一个catch进行匹配,如果匹配成功,则使用指定的catch进行处理,如果没有匹配成功,则向后面的catch继续匹配,如果没有任何的catch匹配成功,则这个时候将交给JVM执行默认处理;

    (5)不管是否有异常都会执行finally程序,如果此时没有异常,执行完finally,则会继续执行程序之中的其他代码,如果此时有异常没有能够处理(没有一个catch可以满足),那么也会执行finally,但是执行完finally之后,将默认交给JVM进行异常的信息输出,并且程序中断。

    (参考:http://blog.csdn.net/wei_zhi/article/details/52836838

     三、finally执行时机:

    测试代码:

     1 public class EmbededFinally {
     2 
     3     
     4     public static void main(String args[]) {
     5         
     6         int result;
     7         
     8         try {
     9             
    10             System.out.println("in Level 1");
    11 
    12            
    13              try {
    14                 
    15                 System.out.println("in Level 2");
    16   // result=100/0;  //Level 2
    17                
    18                  try {
    19                    
    20                      System.out.println("in Level 3");
    21                       
    22                      result=100/0;  //Level 3
    23                 
    24                 } 
    25                 
    26                 catch (Exception e) {
    27                     
    28                     System.out.println("Level 3:" + e.getClass().toString());
    29                 
    30                 }
    31                 
    32                 
    33                 finally {
    34                     
    35                     System.out.println("In Level 3 finally");
    36                 
    37                 }
    38                 
    39                
    40                 // result=100/0;  //Level 2
    41 
    42             
    43                 }
    44             
    45             catch (Exception e) {
    46                
    47                  System.out.println("Level 2:" + e.getClass().toString());
    48            
    49              }
    50              finally {
    51                 
    52                 System.out.println("In Level 2 finally");
    53            
    54              }
    55              
    56             // result = 100 / 0;  //level 1
    57         
    58         } 
    59         
    60         catch (Exception e) {
    61             
    62             System.out.println("Level 1:" + e.getClass().toString());
    63         
    64         }
    65         
    66         finally {
    67            
    68              System.out.println("In Level 1 finally");
    69         
    70         }
    71     
    72     }
    73 
    74 }

    执行结果:

    结论:

    finally 代码块出现在 catch 代码块最后,用来创建在 try 代码块后面执行的代码块。

    无论是否发生异常,finally 代码块中的代码总会被执行。

    四、finally探讨:

    测试代码:

     1 public class SystemExitAndFinally {
     2 
     3     
     4     public static void main(String[] args)
     5     {
     6         
     7         try{
     8 
     9             
    10             System.out.println("in main");
    11             
    12             throw new Exception("Exception is thrown in main");
    13 
    14                     //System.exit(0);
    15 
    16         
    17         }
    18         
    19         catch(Exception e)
    20 
    21             {
    22             
    23             System.out.println(e.getMessage());
    24             
    25             System.exit(0);
    26         
    27         }
    28         
    29         finally
    30         
    31         {
    32             
    33             System.out.println("in finally");
    34         
    35         }
    36     
    37     }
    38 
    39 
    40 }

    执行结果:

    结论:

    当程序在finally代码块之前结束时,因程序退出,finally内的语句将不再执行。

     五、课程成绩:

    程序代码:

     1 import java.util.Scanner;
     2 
     3 public class Grade {
     4     public static void main(String[] args) {
     5         // TODO Auto-generated method stub
     6         double score = 0;
     7         String G;
     8         while(true) {
     9             Scanner in = new Scanner(System.in);
    10             try {
    11                 score = in.nextDouble();
    12                 int s = (int)score;
    13                 s = s / 10;
    14                 switch(s) {
    15                 case 10:
    16                 case 9:G = "优";break;
    17                 case 8:G = "良";break;
    18                 case 7:G = "中";break;
    19                 case 6:G = "及格";break;
    20                 case 5:
    21                 case 4:
    22                 case 3:
    23                 case 2:
    24                 case 1:
    25                 case 0:G = "不及格";break;
    26                 default:throw new Exception();
    27                 }
    28                 System.out.println(G);
    29                 break;
    30             }catch(Exception e) {
    31                 System.out.println("您输入的数据有误,请重新输入");
    32             }
    33         }
    34     }
    35 }

    执行结果:

  • 相关阅读:
    oracle 数据库服务名怎么查
    vmware vsphere 6.5
    vSphere虚拟化之ESXi的安装及部署
    ArcMap中无法添加ArcGIS Online底图的诊断方法
    ArcGIS中字段计算器(高级计算VBScript、Python)
    Bad habits : Putting NOLOCK everywhere
    Understanding the Impact of NOLOCK and WITH NOLOCK Table Hints in SQL Server
    with(nolock) or (nolock)
    What is “with (nolock)” in SQL Server?
    Changing SQL Server Collation After Installation
  • 原文地址:https://www.cnblogs.com/lzq666/p/7886361.html
Copyright © 2011-2022 走看看