java异常处理课后作业

1.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识。

复制代码
import javax.swing.*;
 
class AboutException {
   public static void main(String[] a) 
   {
      int i=1, j=0, k;
      k=i/j;
 
 
    try
    {
         
        k = i/j;    //Causes division-by-zero exception
        throw new Exception("Hello.Exception!");
    }
     
    catch ( ArithmeticException e)
    {
        System.out.println("被0除.  "+ e.getMessage());
    }
     
    catch (Exception e)
    {
        if (e instanceof ArithmeticException)
            System.out.println("被0除");
        else
        {  
            System.out.println(e.getMessage());
             
        }
    }
 
     
    finally
     {
            JOptionPane.showConfirmDialog(null,"OK "+k);
     }
         
  }
 
}
复制代码

结果

 

 

*把可能会发生错误的代码放进try语句块中。

*当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。catch语句块中的代码用于处理错误。

*当异常发生时,程序控制流程由try语句块跳转到catch语句块。

*不管是否有异常发生,finally语句块中的语句始终保证被执行。

*如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。

 

Throwable类有两个直接子类:

Exception:出现的问题是可以被捕获的;

Error:系统错误,通常由JVM处理。

2.

解释奇怪的现象

(1) int i=1, j=0, k;
         k=i/j;

(2) double d1=100,d2=0,result;
   result=d1/d2;
   System.out.println("浮点数除以零:" + data);

(1)的代码运行时会引发异常,而(2)的代码不会引发异常!为什么?

对于(1)而言,java生成的是idiv字节码指令,而(2)java生成的是ddiv字节码指令,

JVM在具体实现这两个指令是,采用了不同的处理策略,导致两段代码运行时得到不同的结果

3.阅读以下代码(CatchWho.java),写出程序运行结果:

复制代码
public class CatchWho { 
    public static void main(String[] args) { 
        try { 
                try { 
                    throw new ArrayIndexOutOfBoundsException(); 
                } 
                catch(ArrayIndexOutOfBoundsException e) { 
                    System.out.println(  "ArrayIndexOutOfBoundsException" +  "/内层try-catch"); 
                }
  
            throw new ArithmeticException(); 
        } 
        catch(ArithmeticException e) { 
            System.out.println("发生ArithmeticException"); 
        } 
        catch(ArrayIndexOutOfBoundsException e) { 
           System.out.println(  "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 
        } 
    } 
}
复制代码

结果

 

 

写出CatchWho2.java程序运行的结果

复制代码
public class CatchWho2 {
    public static void main(String[] args) {
        try {
                try {
                    throw new ArrayIndexOutOfBoundsException();
                }
                catch(ArithmeticException e) {
                    System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
                }
            throw new ArithmeticException();
        }
        catch(ArithmeticException e) {
            System.out.println("发生ArithmeticException");
        }
        catch(ArrayIndexOutOfBoundsException e) {
            System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
        }
    }
}
复制代码

结果

 

 throw一个异常后,必须catch成功,才能throw下一个异常,系统不能累积处理异常

4.当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。 请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。

复制代码
public class EmbededFinally {
 
     
    public static void main(String args[]) {
         
        int result;
         
        try {
             
            System.out.println("in Level 1");
 
            
            try {
                 
                System.out.println("in Level 2");
  // result=100/0;  //Level 2
                
                try {
                    
                    System.out.println("in Level 3");
                       
                    result=100/0;  //Level 3
                 
                }
                 
                catch (Exception e) {
                     
                    System.out.println("Level 3:" + e.getClass().toString());
                 
                }
                 
                 
                finally {
                     
                    System.out.println("In Level 3 finally");
                 
                }
                 
                
                // result=100/0;  //Level 2
 
             
                }
             
            catch (Exception e) {
                
                System.out.println("Level 2:" + e.getClass().toString());
            
            }
            finally {
                 
                System.out.println("In Level 2 finally");
            
             }
              
            // result = 100 / 0;  //level 1
         
        }
         
        catch (Exception e) {
             
            System.out.println("Level 1:" + e.getClass().toString());
         
        }
         
        finally {
            
            System.out.println("In Level 1 finally");
         
        }
     
    }
 
}
复制代码

结果

 

 当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

5.finally语句块一定会执行吗? 请通过 SystemExitAndFinally.java示例程序回答上述问题

复制代码
public class SystemExitAndFinally {
 
     
    public static void main(String[] args)
    {
         
        try{
 
             
            System.out.println("in main");
             
            throw new Exception("Exception is thrown in main");
 
                    //System.exit(0);
 
         
        }
         
        catch(Exception e)
 
            {
             
            System.out.println(e.getMessage());
             
            System.exit(0);
         
        }
         
        finally
         
        {
             
            System.out.println("in finally");
         
        }
     
    }
 
 
}
复制代码

结果

 

 不一定,因为当代码 System.exit(0);意思是,终止JAVA虚拟机,导致不能执行finally的内容!

posted @   lcz111  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示