JAVA09异常处理之动手动脑问题

动手动脑1:为什么不管是否有异常发生,finally语句块中的语句始终保证被执行?

我们在写代码时,如果finally块中的代码过多会导致字节码条数”膨胀”,因为finally中的字节码会被”复制”到try块和所有的catch块中。finally语句块主要用于解决资源泄露问题,它位于catch语句块之后,JVM保证它们一定执行。

动手动脑2:CatchWho.java,写出程序运行结果:

ArrayIndexOutOfBoundsException/内层try-catch
发生ArithmeticException

运行结果截图:

结果相同。

动手动脑3:CatchWho2.java,写出程序运行结果:

ArrayIndexOutOfBoundsException/外层try-catch

运行结果截图:

结果相同。

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

EmbedRinally.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) {//exception异常

                    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");

        }

    }

}

程序运行结果:

总结:①catch语句一定和相邻的try,才可以接收到抛出的错误。

②finally语句是不管有没有异常都可以执行。

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

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);”:System是一个Java类,调用exit(0)方法终止虚拟机也就是退出你的Java程序,括号里面的是参数,进程结束的返回值。即是强制退出程序。

“System.exit(1);”:即是异常终止。

因为catch中有“System.exit(0);”,使得程序终止,所以不会执行finally语句,但一般情况下,finally都会执行。

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

程序代码:

package Test;

import java.util.Scanner;

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

//三种异常错误类
class MyException extends Exception{
    public MyException(String e){
        super(e);
    }
}
class NumException extends Exception{
    public NumException(String e){
        super(e);
    }
}
class CCharException extends Exception{
    public CCharException(String e){
        super(e);
    }
}

public class Score {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str;
        int score;
        Scanner scan=new Scanner(System.in);
     System.out.print("请输入语文成绩(整数):");
     str=scan.next();
    int x=1;
    if(!str.matches("^[0-9]+$")){//是字符串-不是数字
         try{throw new CCharException("出错!应输入数字!"); }
         catch(CCharException e){
             System.out.println(e);}
         finally {System.out.println();} }
  else//不是字符串-是数字
    {
      double num= Double.parseDouble(str);
        int a=(int)num;
        //System.out.println(num);
        //System.out.println(a);
     if(num!=a){//输入的内容是double型
        try{throw new NumException("出错!应输入整数!"); }
    catch(NumException e){
            System.out.println(e);}
        finally {System.out.println();}
    }
    else if(a<0 || a>100)
    {  try{
        throw new MyException("出错!成绩范围应为0~100分!");
        }catch(MyException e){
            System.out.println(e);
        }finally {
          System.out.println();
         }}
    else{
     if(a<60) System.out.println("不及格!");
     else if(a>=60 && a<70) System.out.println("及格!");
     else if(a>=70 && a<80) System.out.println("中!");
     else if(a>=80 && a<90) System.out.println("良!");
     else if(a>=90 && a<=100) System.out.println("优!");
    }
     }//else
}//main
}

程序运行截图:

时间: 2024-10-07 00:29:57

JAVA09异常处理之动手动脑问题的相关文章

异常处理(动手动脑)

1.Java中实现异常处理的基础知识. 1)Java 中所有可捕获的异常都派生自 Exception 类. 2)把可能会发生错误的代码放进try语句块中. 3)当程序检测到出现了一个错误时会抛出一个异常对象.异常处理代码会捕获并处理这个错误. 4)catch语句块中的代码用于处理错误. 5)当异常发生时,程序控制流程由try语句块跳转到catch语句块. 6)不管是否有异常发生,finally语句块中的语句始终保证被执行. 7)如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序. Th

JAVA 多态和异常处理作业——动手动脑以及课后实验性问题

1.  阅读以下代码(CatchWho.java),写出程序运行结果: 1)  源代码 public class CatchWho { public static void main(String[] args) { try { try { throw new ArrayIndexOutOfBoundsException(); } catch(ArrayIndexOutOfBoundsException e) { System.out.println(  "ArrayIndexOutOfBoun

异常处理的动手动脑

一,抛异常的类型 抛异常:1,Error错误,系统错误 2,Exception错误Exception类又包括:RuntimeException非检查异常和检查异常.Error例子: 1.AssertionError程序运行期间判断某个条件是否满足,不满足时,抛出AssertionError. 2.OOM Error系统内存不足. 二,小探索 int i=1, j=0, k;k=i/j; javac生成idiv字节码指令double d1=100,d2=0,result;    result=d1

java09动手动脑

一.动手动脑 运行AboutException.java示例 1)源代码 import javax.swing.*; class AboutException { public static void main(String[] a) { double i=-1, j=0, k; k=i/j; try { k = i/j; // Causes division-by-zero exception //throw new Exception("Hello.Exception!"); }

异常处理---动手动脑及课后作业

动手动脑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

java动手动脑异常处理

实验任务一:多层的异常捕获-1 1.实验内容:阅读(CatchWho.java),写出程序运行结果: public class CatchWho{ public static void main(String[] args) { try { try { throw new ArrayIndexOutOfBoundsException(); } catch(ArrayIndexOutOfBoundsException e) { System.out.println(  "ArrayIndexOut

动手动脑之多态与异常处理

动手实验一:下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m; 先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确: java中基类对象不能当做子类对象使用,需要用强制转换来实现,子类对象变量=(子类名)基类对象名:错误的代码是d=m; d=c; 错误原因:类型不匹配:不能从 Mammal 转换为 Dog. 动手实验二:运行以下测试代码 上边的程序运行结果是什么?.你如

动手动脑之异常处理

1.阅读代码(CatchWho.java),写出程序运行结果 public class CatchWho { public static void main(String[] args) { try { try { throw new ArrayIndexOutOfBoundsException(); } catch(ArrayIndexOutOfBoundsException e) { System.out.println( "ArrayIndexOutOfBoundsException&qu

java动手动脑——异常处理

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