Java的动手动脑(六)
日期:2018.11.8
星期四
博客期:022
-----------------------------------------------------------------------------------------
Part 1: 基本异常处理
package teacher;
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("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");
}
}
}
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)
package teacher;
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");
}
}
}
CatchWho.java
package teacher;
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");
}
}
}
CatchWho2.java
这两段代码的运行截图分别如下:


说明:那我就把这两个案例综合在一起分析吧!首先对比这两个案例!我们可以看到区别,内部try{}里的所要catch的异常不同——ArrayIndexOutOfBoundsException和ArithmeticException,但究竟是什么原因导致了这结果的不同呢?我来说吧!这无外乎就是这一个catch的嵌套比较特殊!因为它两层的嵌套有重复的Exception监听处理,这就产生了另外一个问题——究竟是哪个或哪些部分catch到了异常呢?我们从运行结果中可以得知,catch是就近原则的,于是只要这个 Exception 被 catch 到了就不能再被非finally的catch语句catch到!所以就是这样的结果了!因为Exception不属于内部的catch的要求类型,因而没有被内部的catch语句catch到,而是外部的catch语句!所以第二个就会执行外部的catch操作!
-----------------------------------------------------------------------------------------
Part 3: 不同的finally语句的顺序
package teacher;
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");
}
}
}
EmbededFinally.java
运行结果:

说明:这个问题恰恰说的就是我Part 2所提到的问题——那个监听类型重复之后的顺序问题!就拿本程序来说,输出的顺序毫无疑问是1、2、3的顺序,而后面的finally的执行顺序却是3、2、1的顺序,当然这也是很容易理解的——毕竟还是按顺序来说,先执行try内部,当这个try的finally{}结束之后,外部的finally{}才能得以继续!所以finally的执行顺序是从内到外的!
-----------------------------------------------------------------------------------------
Part 4: 解析finally不执行的特殊情况
package teacher;
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");
}
}
}
SystemExitAndFinally.java
运行结果:

说明:这个问题说明即使是finally也不能改变System.exit(0);能够直接退出运行状态的功能!这可能是finally唯一的不执行的情况!嗯,就目前来看吧,嗯!好像利用关机、任务管理器直接退出eclipse的,我就不说了!
-----------------------------------------------------------------------------------------
Java的动手动脑(六)的更多相关文章
- java异常处理动手动脑问题解决和课后总结
动手动脑 一.问题:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. 1.源代码 import javax.swing.*; cl ...
- Java之动手动脑(三)
日期:2018.10.12 星期五 博客期:017 这次留了两个动手动脑作业!我需要一个一个来说!先说第一个吧! Part 1 :随机生成1000个随机数 代码: //以下为 RandomMaker. ...
- java的动手动脑10月20日
(1)动手动脑 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { /*** @param args*/publi ...
- Java的动手动脑
动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] ...
- java课java方法动手动脑
动手动脑: import java.util.Scanner; public class Random { public static void main(String[] args) { ...
- java课堂动手动脑及课后实验总结
动手动脑一:枚举 输出结果: false false true SMALL MEDIUM LARGE 分析和总结用法 枚举类型的使用是借助ENUM这样一个类,这个类是JAVA枚举类型的公共基本 ...
- java课堂动手动脑博客
随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 要求将设计思路.程序流程图.源程序代码.结果截图.编程总结等发表到博客园. (截止时间2015 ...
- Java一些动手动脑实验
一.Java字段初始化的规律: 输出结果为:100 和 300 当把{filed=200}放在public int field=100之后输出结果为:200 和 300 所以执行类成员定义时指定的默认 ...
- Java的动手动脑(七)
日期:2018.11.18 博客期:025 星期日 Part 1:使用 Files.walkFileTree()来找出指定文件夹下大小大于1KB的文件 package temp; import jav ...
随机推荐
- Git学习一:基本用法
git config:配置相关信息 git clone:复制仓库 git init:初始化仓库 git add:添加更新内容到索引中 git diff:比较内容 git status:获取当前项目状况 ...
- ue4 socket
Socket 地址: TSharedRef<FInternetAddr> internetAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSY ...
- 算法 - 链的操作(三) - 返回倒数第k个节点(no.23)
输入一个链 : 1 -> 3 -> 5 -> 6 -> 8 输入 k = 2 返回 6 这个节点 python(2.7) def getNode(head, k): if(h ...
- zabbix系列 ~ mongo监控相关
,一 简介: 我们来谈谈mongo的监控二 核心命令 rs.status() 关注复制集群是否健康 db.serverStatus() 关注实例整体性能三 目标解读 主要来解读下db. ...
- MyBatis学习七:spring和MyBatis整合
<\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...
- Spring4之AOP
[www.dev1234.com]一头扎进Spring4视频教程\一头扎进Spring4源码\[www.java1234.com]<一头扎进Spring4>第七讲 源码 [www.dev1 ...
- IMX6开发板学习烧写Linux-QT系统步骤做个笔记
平台:迅为-i.MX6开发板 烧写系统:Linux-QT <ignore_js_op> Qt系统的烧写,是使用 MfgTool2 工具,只需要简单的配置下. 打开 “Mfgt ...
- 2017-2018-2 20165237 实验四《Android开发基础》实验报告
2017-2018-2 20165237 实验四<Android开发基础>实验报告 实验报告表头: No.1 实验要求: Android程序设计-1 实验要求: 参考<Java和An ...
- qt5.6.2简单操作mysql数据库
1.新建个项目后,需要在.pro工程文件在中添加QT += sql,否则编译会出错: 2.如果出现数据库驱动未加载,则需要把mysql下的libmysql.dll拷贝到D:\Qt5.6.2\5.6\m ...
- CF1105E Helping Hiasat
题目地址:CF1105E Helping Hiasat 首先将问题转化成图论:对每个人建立一个点,将同一次修改后的所有人代表的点两两连一条边,那么最终所求的就是这个图的最大独立集 我们知道最大独立集是 ...