日期: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. try
  12. {
  13.  
  14. k = i/j; // Causes division-by-zero exception
  15. throw new Exception("Hello.Exception!");
  16. }
  17.  
  18. catch ( ArithmeticException e)
  19. {
  20. System.out.println("被0除. "+ e.getMessage());
  21. }
  22.  
  23. catch (Exception e)
  24. {
  25. if (e instanceof ArithmeticException)
  26. System.out.println("被0除");
  27. else
  28. {
  29. System.out.println(e.getMessage());
  30.  
  31. }
  32. }
  33.  
  34. finally
  35. {
  36. JOptionPane.showConfirmDialog(null,"OK");
  37. }
  38.  
  39. }
  40. }

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是就近原则的,于是只要这个 Exception 被 catch 到了就不能再被非finally的catch语句catch到!所以就是这样的结果了!因为Exception不属于内部的catch的要求类型,因而没有被内部的catch语句catch到,而是外部的catch语句!所以第二个就会执行外部的catch操作!

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

  Part 3: 不同的finally语句的顺序

  1. package teacher;
  2.  
  3. public class EmbededFinally {
  4.  
  5. public static void main(String args[]) {
  6.  
  7. int result;
  8.  
  9. try {
  10.  
  11. System.out.println("in Level 1");
  12.  
  13. try {
  14.  
  15. System.out.println("in Level 2");
  16. // result=100/0; //Level 2
  17.  
  18. try {
  19.  
  20. System.out.println("in Level 3");
  21.  
  22. result=100/0; //Level 3
  23.  
  24. }
  25.  
  26. catch (Exception e) {
  27.  
  28. System.out.println("Level 3:" + e.getClass().toString());
  29.  
  30. }
  31.  
  32. finally {
  33.  
  34. System.out.println("In Level 3 finally");
  35.  
  36. }
  37.  
  38. // result=100/0; //Level 2
  39.  
  40. }
  41.  
  42. catch (Exception e) {
  43.  
  44. System.out.println("Level 2:" + e.getClass().toString());
  45.  
  46. }
  47. finally {
  48.  
  49. System.out.println("In Level 2 finally");
  50.  
  51. }
  52.  
  53. // result = 100 / 0; //level 1
  54.  
  55. }
  56.  
  57. catch (Exception e) {
  58.  
  59. System.out.println("Level 1:" + e.getClass().toString());
  60.  
  61. }
  62.  
  63. finally {
  64.  
  65. System.out.println("In Level 1 finally");
  66.  
  67. }
  68.  
  69. }
  70.  
  71. }

EmbededFinally.java

  运行结果:

  说明:这个问题恰恰说的就是我Part 2所提到的问题——那个监听类型重复之后的顺序问题!就拿本程序来说,输出的顺序毫无疑问是1、2、3的顺序,而后面的finally的执行顺序却是3、2、1的顺序,当然这也是很容易理解的——毕竟还是按顺序来说,先执行try内部,当这个try的finally{}结束之后,外部的finally{}才能得以继续!所以finally的执行顺序是从内到外的!

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

  Part 4: 解析finally不执行的特殊情况

  1. package teacher;
  2.  
  3. public class SystemExitAndFinally {
  4.  
  5. public static void main(String[] args)
  6. {
  7.  
  8. try{
  9.  
  10. System.out.println("in main");
  11.  
  12. throw new Exception("Exception is thrown in main");
  13.  
  14. //System.exit(0);
  15.  
  16. }
  17.  
  18. catch(Exception e)
  19.  
  20. {
  21.  
  22. System.out.println(e.getMessage());
  23.  
  24. System.exit(0);
  25.  
  26. }
  27.  
  28. finally
  29.  
  30. {
  31.  
  32. System.out.println("in finally");
  33.  
  34. }
  35.  
  36. }
  37.  
  38. }

SystemExitAndFinally.java

  运行结果:

  说明:这个问题说明即使是finally也不能改变System.exit(0);能够直接退出运行状态的功能!这可能是finally唯一的不执行的情况!嗯,就目前来看吧,嗯!好像利用关机、任务管理器直接退出eclipse的,我就不说了!

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

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

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

    动手动脑 一.问题:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. 1.源代码 import javax.swing.*; cl ...

  2. Java之动手动脑(三)

    日期:2018.10.12 星期五 博客期:017 这次留了两个动手动脑作业!我需要一个一个来说!先说第一个吧! Part 1 :随机生成1000个随机数 代码: //以下为 RandomMaker. ...

  3. java的动手动脑10月20日

    (1)动手动脑 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { /*** @param args*/publi ...

  4. Java的动手动脑

    动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] ...

  5. java课java方法动手动脑

    动手动脑: import java.util.Scanner; public class Random { public static void main(String[] args) {       ...

  6. java课堂动手动脑及课后实验总结

      动手动脑一:枚举   输出结果: false false true SMALL MEDIUM LARGE 分析和总结用法 枚举类型的使用是借助ENUM这样一个类,这个类是JAVA枚举类型的公共基本 ...

  7. java课堂动手动脑博客

    随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 要求将设计思路.程序流程图.源程序代码.结果截图.编程总结等发表到博客园. (截止时间2015 ...

  8. Java一些动手动脑实验

    一.Java字段初始化的规律: 输出结果为:100 和 300 当把{filed=200}放在public int field=100之后输出结果为:200 和 300 所以执行类成员定义时指定的默认 ...

  9. Java的动手动脑(七)

    日期:2018.11.18 博客期:025 星期日 Part 1:使用 Files.walkFileTree()来找出指定文件夹下大小大于1KB的文件 package temp; import jav ...

随机推荐

  1. javascript文档

    DOM Document <html> Document 对象 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页 ...

  2. steps/train_mono.sh

    <<单音素HMM的训练流程图.vsdx>> 定义拓扑结构.参数初始化 $ gmm-init-mono --shared-phones=$lang/phones/sets.int ...

  3. Spring中的@Transactional(rollbackFor = Exception.class)属性详解

    序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法: 异常 如下图所示,我们都 ...

  4. 多分类Logistics回归公式的梯度上升推导&极大似然证明sigmoid函数的由来

    https://blog.csdn.net/zhy8623080/article/details/73188671  也即softmax公式

  5. ajax跨域请求のJSONP

    简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量级 ...

  6. java ==、equals、hashcode有什么区别

    1.== 用来比较两个对象的存储空间 2.equals是Object类提供的方法之一,每个java类都继承Object类,所以每一个对象都具有equals方法,所以在没有覆盖equals方法的情况下, ...

  7. 鉴权完成后如何拿到SpringSocial的用户信息

    ⒈ package cn.coreqi.social.config; import org.springframework.beans.factory.annotation.Autowired; im ...

  8. [Jenkins]CentOS7下Jenkins搭建

    最近在倒腾Kubernetes的一些东西,这次需要用到Jenkins来实现自动化构建.来讲一讲搭建的整个过程. Jenkins是什么 Jenkins提供了软件开发的持续集成服务.它运行在Servlet ...

  9. Python os.walk文件遍历用法【转】

    python中os.walk是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 1.载入 要使用os.walk,首先要载入该函数 可以使用以下两种方法 import os ...

  10. mac下安装memcache

    需求包安装libmemcached brew install libmemcached 安装memcached brew install memcached 启动服务 brew services st ...