• 07异常处理


    1、 【请尝试解释以下奇怪的现象!】

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

     代码在运行时
    会引发异常

    上边代码在运行时
    不会引发异常

     浮点数除以0:Infinity

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

     javac 生成 idiv字节码指令

    javac 生成ddiv字节码指令

    jvm在处理浮点数时,生成的是ddiv字节码指令,i/0,0转化为浮点数0.0,而0.0是double类型的,并不精确,所以不会抛出异常。

    jvm在处理整数时,生成的是idiv字节码指令,整数除0就是除0,会抛出异常。

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

    2、【动手动脑:多层的异常捕获-1】

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

    运行结果:

    3、【动手动脑:多层的异常捕获-2】

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

    运行结果:

    4、【动手动脑】

    当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。
    请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。
    特别注意:
    当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

    源代码:


    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

    1)try抛出一个异常之后,程序会跳出try,不再执行try后边的语句,开始对catch进行匹配,处理异常;

    2)try嵌套中,抛出的异常只有被处理才可以按顺序抛出下一个异常,如果不处理,程序就终止;

    3)try抛出异常之后,就跳出了try语句,内层catch无法捕获就继续向外抛,所以外层也就有异常,外层语句不执行,第二个程序 throw  new ArithmeticExcepption没有执行。

    4)第三个程序,try第一层第二层没有异常不用捕获,执行完之后到第三层,除0有异常,catch捕获,执行第三层的finally然后,顺序执行第二层,第一层的finally。

    总结try catch finally嵌套使用执行顺序

    1)try语句嵌套从外层到内层执行,在try语句中,哪一层出错,哪一层就抛出异常,后边的try语句就不再执行,如果该层存在catch就进行相应的捕获,有该层的finally也执行,除非finally遇到不执行的情况;

    2)如果该层没有catch进行捕获,就向外抛出,去找catch,如果没有catch进行捕获,就终止程序。

    【课后作业2 动手动脑】

    编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。
    要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃。

    import java.util.Scanner;

    public class Score {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    boolean f=true,h=true,q=true;
    int Sc=0;
    while(f){
    System.out.println("Please input a score:");
    Scanner s=new Scanner(System.in);
    String ss=s.nextLine();

    int a=ss.length();
    for(int i=0;i<a;i++){
    if((ss.charAt(i)<'0')||(ss.charAt(i)>'9'))
    break;

    else
    {
    q=false;
    h=false;
    }
    }


    if(q){
    try{
    throw new ScException();
    }
    catch(ScException e){
    System.out.println("格式错误");
    }
    }
          if(!h) //输入的是数字
    {
    Sc=Integer.parseInt(ss);
    if((Sc<0)||(Sc>100))
    {
    try{
    ScException x= new ScException();
    throw x;
    }
    catch(ScException x){
    System.out.println("输入异常,请输入整数");


    }
    }
    else
    f=false;
    }

    }
    if(Sc<60)
    System.out.println("不及格");
    else if(Sc<70)
    System.out.println("及格");
    else if(Sc<80)
    System.out.println("中");
    else if(Sc<90)
    System.out.println("良");
    else if((Sc<100)||(Sc==100))
    System.out.println("优");

    }

    }
    class ScException extends Exception{
    public ScException(){

    }
    }

    结果截图:

  • 相关阅读:
    对象不支持“split”属性或方法
    js中加减乘除遇到小数时的位数问题
    js 日期增加
    使用JavaScript的XMLHttpRequest发送请求
    Jquery弹出框以及跟随页面滚动
    sql导出excel数据量过大的处理(需解决)
    PowerDesigner 12.5 导致的 Office Word 2007 鼠标在文档中无效的问题
    检测字符串是否是数字
    两张表合并加标识根据ID
    left outer join 和 right outer join 和 join 的区别
  • 原文地址:https://www.cnblogs.com/DaisyYuanyq/p/7845941.html
Copyright © 2020-2023  润新知