zoukankan      html  css  js  c++  java
  • java课后思考问题(八)

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

    (1)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");
         }
      
      }
    }

    (2)在java中捕获异常的语句为:

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

    (3)使用Java异常处理机制

    当异常发生时,程序控制流程由try语句块跳转到catch语句块;
    不管是否有异常发生,finally语句块中的语句始终保证被执行;
    如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。 

    (4)Java中的异常分类

    Throwable类有两个直接子类:
    Exception:出现的问题是可以被捕获的;
    Error:系统错误,通常由JVM处理。

    捕获的异常又可以分为两类:
    (1)Check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出
    (2)Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象:

    3.可以使用javap去反汇编两个示例程序的.class文件(一个是AboutException.class,另一个是ThrowDemo.class),从中你会有所发现的。

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

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


     

     
          

     

     5.请先阅读 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");
            }
       }
     }

    原因:当有多个嵌套的try…catch…finally时,异常在不同位置被接受,可能会导致异常下面的finally语句块执行顺序。不管是否有异常发生,finally语句块中的语句始终保证被执行。

    6.finally语句块一定会执行吗?

    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)可以终止程序。

    6.依据对本讲多个示例程序的分析,请自行归纳总结出Java多层嵌套异常处理的基本流程。

             基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出。你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。finally语句块会在方法执行return之前执行。

    7.编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。

    import java.io.*;
    import java.util.Scanner;
    public class Score {

     public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            String grade,scor;
            double score;
            try {
               System.out.println("请输入你的成绩");
               scor=scanner.next();
                score=Double.parseDouble(scor);
             assert score>=0 &&score<=100:"输入的成绩必须是0到100之间";
        
               if(score<60) {
                grade="不及格";
               }
               else if(score<70) {
                grade="及格";
               }
               else if(score<85) {
                grade="中";
               }
               else if(score<90) {
                grade="良";
               }
               else {
                grade="优";
               }
               System.out.println("等级为"+grade); 
            } catch(NumberFormatException e) {
                System.out.println("输入必须为数字");
            }
     }
     

    }

    结果截图:

    (1)输入0到100内的整数

    (2)输入0到100内的小数

    (3)输入不是数字的其他字符

    (4)输入负数

    (5)输入大于100的数

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    坚持--从今天开始
    51系列单片机的精确延时的解释(文章如有问题之处,请劳烦指正,谢谢!) 可以看看采纳下。
    利用宏定义实现C++程序在Unix和Win32环境下的通用性
    [转]浅谈C++指针直接调用类成员函数
    类间调用inline函数的效率
    C++ inline函数与编译器设置
    GNU的makefile文件编写说明
    Windows Live Writer 2012 Test
    测试Windows Live Writer
    Mathematica学习笔记2
  • 原文地址:https://www.cnblogs.com/wl2017/p/7845238.html
Copyright © 2011-2022 走看看