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

    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);
             //JOptionPane.showInternalConfirmDialog(null, k);
     }
  }

}

结果分析

Try{//可能发生运行错误的代码;  }

catch(异常类型     异常对象引用){   //用于处理异常的代码 }

finally{   //用于“善后” 的代码}

Java 中所有可捕获的异常都派生自 Exception 类。

二.使用Java异常处理机制

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

三.动手动脑  多层的异常捕获-1

1)源代码

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

结果分析
抛出两次异常,第一次处理完毕后,处理第二次。

四.动手动脑  多层的异常捕获-2

1)源代码

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

2)结果截图

3)结果分析

一个异常匹配结束后,才能执行下一个异常,系统不能累积处理异常。

五.动手动脑  当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。

1)源代码

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

3)结果分析

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

六.动手动脑  finally语句块一定会执行吗?

1)源程序

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的内容。

七.动手动脑

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

1)源代码

import java.util.*;
public class Prograss {
    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        String pro;
        System.out.println("请输入成绩:");
        while(true){
        try{
            pro=sc.nextLine();
            if(pro.matches("\\D*")){
                throw new InException("输入有误!不是的不是数字!");
            }
            else{
                int proo=Integer.parseInt(pro);
                System.out.print("输入正确!");
                judge(proo);
                break;
            }
         }
        catch(InException e){
            System.out.print("请重新输入:");
        }
    }
        sc.close();
    }

    public static void judge(int pro){
        if(pro>=0&&pro<60)
            System.out.println("成绩不合格!");
        else if(pro<70)
            System.out.println("成绩合格!");
        else if(pro<80)
            System.out.println("成绩中!");
        else if(pro<90)
            System.out.println("成绩良!");
        else if(pro<=100)
            System.out.println("成绩优!");
        else
            System.out.println("输入成绩不符");
    }
}

class InException extends Exception{//
    public InException(String msg){
        super(msg);
    }
}
时间: 2024-10-04 23:30:11

java09动手动脑的相关文章

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

动手动脑1:为什么不管是否有异常发生,finally语句块中的语句始终保证被执行? 我们在写代码时,如果finally块中的代码过多会导致字节码条数"膨胀",因为finally中的字节码会被"复制"到try块和所有的catch块中.finally语句块主要用于解决资源泄露问题,它位于catch语句块之后,JVM保证它们一定执行. 动手动脑2:CatchWho.java,写出程序运行结果: ArrayIndexOutOfBoundsException/内层try-ca

动手动脑 自信成就人生之课后作业

?动手动脑一 请看以下代码: 上述代码可以顺利通过编译,并且输出一个“很奇怪”的结果: Ljava.lang.Object;@ba8a1dc 为什么会这样? 解释:java的object数组不能转化成string数组,在转换出错时,首先要观察被转换的对象原来是什么类型,或解开多层的包装,直到获取对象的最终类型,然后把不能再分解的类型转换成自己目标类型的对象...(稍微能理解) ?动手动脑二 随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中.

java动手动脑08

一.动手动脑 1)源代码: public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue

JAVA语法基础作业——动手动脑以及课后实验性问题 (七)

一.动手动脑 1)源代码 public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue(

java多态动手动脑

实验任务一:多态实现ATM工作原理 1)源代码: package demo; import java.util.Scanner; class A{ String name; String date; String mima; int yu; String kahao; public A(String name,String date,String mima,int yu,String kahao) { this.name=name; this.date=date; this.mima=mima;

动手动脑,无法自拔(3)课时作业6

1.动手动脑(五子棋棋盘排布) (1)源程序 1 import java.io.*; 2 3 public class QiPan 4 { 5 //定义一个二维数组来充当棋盘 6 private String[][] board; 7 //定义棋盘的大小(宏定义) 8 private static int BOARD_SIZE = 15; 9 10 //初始化棋盘 11 public void initBoard() 12 { 13 //初始化棋盘数组 14 board = new String

java的动手动脑10月20日

(1)动手动脑 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { /*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubInitializeBlockClass obj=new InitializeBlockClass();System.out.println(obj.field)

动手动脑课堂作业7---------

动手动脑1 CatchWho.java运行结果: CatchWho2.java运行结果: EmbedeFinally.java运行结果: finally语句块一定会执行吗? SystemExitAndFinally.java运行结果: 只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行.如果在try语句块之前返回(return)或者抛出异常,try对应的finally语句块就不会执行. 动手动脑2 如何跟踪异常的传播路径? 当程序中出现异常时,JVM

课后作业及动手动脑

动手动脑 请查看String.equals()方法的实现代码,注意学习其实现方法. public class StringEquals { public static void main(String[] args) { String s1=new String("Hello"); String s2=new String("Hello"); System.out.println(s1==s2); System.out.println(s1.equals(s2));