Java的动手动脑(六)

日期:2018.11.8

星期四

博客期:022

-----------------------------------------------------------------------------------------

  Part 1: 基本异常处理

 1 package teacher;
 2
 3 import javax.swing.*;
 4
 5 class AboutException {
 6    public static void main(String[] a)
 7    {
 8       int i=1, j=0, k;
 9       k=i/j;
10
11
12     try
13     {
14
15         k = i/j;    // Causes division-by-zero exception
16         throw new Exception("Hello.Exception!");
17     }
18
19     catch ( ArithmeticException e)
20     {
21         System.out.println("被0除.  "+ e.getMessage());
22     }
23
24     catch (Exception e)
25     {
26         if (e instanceof ArithmeticException)
27             System.out.println("被0除");
28         else
29         {
30             System.out.println(e.getMessage());
31
32         }
33     }
34
35
36     finally
37      {
38              JOptionPane.showConfirmDialog(null,"OK");
39      }
40
41   }
42 }

AboutException.java

  运行结果如下:

  说明:因为当你的程序出现错误的时候,即第一个 k = i / j ;语句执行的时候,你的程序运行到这里就结束(中断)了,不可能继续运行try{}里的 k = i / j ;语句,所以会是这个结果!而当你将它的第一个 k = i / j; 用//或/**/注释掉之后 ,运行结果如下:

  在你注释掉了以后,它会继续执行try{}里的 k = i / j ;语句,也就会在try{}里抛出 ArithmeticException ,而后边刚好有catch 语句接到了,进而做了内部处理,由于 ArithmeticException 已经得到了 catch,后面的 catch (Exception e) 就没有接到,于是不执行,而后面的finally除了特殊情况,一般是要执行的,于是便是这样的结果!但如果你把第二个 k = i / j; 也用//或/**/注释掉之后,运行结果如下:

  理由很清晰,就是根据类型执行catch 语句和 finally 语句!

-----------------------------------------------------------------------------------------

  Part 2: 多层的异常捕获(1+2)

 1 package teacher;
 2
 3 public class CatchWho {
 4     public static void main(String[] args) {
 5         try {
 6                 try {
 7                     throw new ArrayIndexOutOfBoundsException();
 8                 }
 9                 catch(ArrayIndexOutOfBoundsException e) {
10                        System.out.println(  "ArrayIndexOutOfBoundsException" +  "/内层try-catch");
11                 }
12
13             throw new ArithmeticException();
14         }
15         catch(ArithmeticException e) {
16             System.out.println("发生ArithmeticException");
17         }
18         catch(ArrayIndexOutOfBoundsException e) {
19            System.out.println(  "ArrayIndexOutOfBoundsException" + "/外层try-catch");
20         }
21     }
22 }

CatchWho.java

 1 package teacher;
 2
 3 public class CatchWho2 {
 4     public static void main(String[] args) {
 5         try {
 6                 try {
 7                     throw new ArrayIndexOutOfBoundsException();
 8                 }
 9                 catch(ArithmeticException e) {
10                     System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
11                 }
12             throw new ArithmeticException();
13         }
14         catch(ArithmeticException e) {
15             System.out.println("发生ArithmeticException");
16         }
17         catch(ArrayIndexOutOfBoundsException e) {
18             System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
19         }
20     }
21 }

CatchWho2.java

  这两段代码的运行截图分别如下:

  说明:那我就把这两个案例综合在一起分析吧!首先对比这两个案例!我们可以看到区别,内部try{}里的所要catch的异常不同——ArrayIndexOutOfBoundsException和ArithmeticException,但究竟是什么原因导致了这结果的不同呢?我来说吧!这无外乎就是这一个catch的嵌套比较特殊!因为它两层的嵌套有重复的Exception监听处理,这就产生了另外一个问题——究竟是哪个或哪些部分catch到了异常呢?我们从运行结果中可以得知,catch是就近原则的,而且除了

原文地址:https://www.cnblogs.com/onepersonwholive/p/9930040.html

时间: 2024-10-12 03:07:53

Java的动手动脑(六)的相关文章

java异常处理动手动脑问题解决和课后总结

动手动脑 一.问题:请阅读并运行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 Exc

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;

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)

Java的动手动脑

动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARGE; //s和t引用同一个对象? System.out.println(s==t);  // //是原始数据类型吗? System.out.println(s.getClass().isPrimitive());

JAVA中动手动脑

第一个动手动脑: 首先用枚举类型定义两个变量,然后判断两个变量是否引用同一对象,在判断枚举类型是否是原始数据类型,再从字符串中转换,最后列出所有的对象. 很明显,这两个变量都是枚举类型,但是这两个变量引用的对象不一样,同样,枚举类型并不是原始数据类型. 得出的结论就是,同是枚举类型,但是引用的对象可以不同,枚举类型并不是原始数据类型. 我可能还是用不好枚举类型. 第二个动手动脑: 很明显,+a+b,只不过是先显示a再显示b, 而a+b+“  .. ”,就是先把a+b的结果显示出去,然后再加上要显

Java课堂动手动脑-截图集锦

课堂实践性问题 没有数据类型,名称与类名相同,没有返回值 类本身有自定义的构造方法,调用时应有参数,这时系统不再使用默认构造方法 类字段初始化顺序 1.执行类成员定义时指定的默认值或累的初始化块,执行哪一个看哪一个排在前面. 2.执行类的构造函数 动手动脑问题(类之间继承,创建子类对象导致父类初始化块的执行) 静态初始化执行顺序 1.静态初始化块只执行一次 2.创建子类的对象时,父类的初始化块也会执行 静态方法访问实例成员变量如下:

Java 7 动手动脑

Java 课后作业 一.运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大! 1.源代码: class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String s

java课堂动手动脑

实验任务一:阅读并运行示例PassArray.java. 1)源代码: package demo; //PassArray.java //Passing arrays and individual array elements to methods public class PassArray { public static void main(String[] args) { int a[] = { 1, 2, 3, 4, 5 }; String output = "The values of

java课堂 动手动脑3

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