`

java中Exception的细节

    博客分类:
  • Java
阅读更多
一、异常的丢失

    任何一个Java程序员应该都不会不知道Java中的Exception机制。下面是总结的一些在开发中不是太过于重要的关于Exception的细节。有时候就是因为不注意这些细节而导致一些不易发现的问题。

之前看过一个blog http://blog.csdn.net/hguisu/article/details/6155636 上边有一段代码:
public class TestException {  
    public TestException() {  
    }  
  
    boolean testEx() throws Exception {  
        boolean ret = true;  
        try {  
            ret = testEx1();  
        } catch (Exception e) {  
            System.out.println("testEx, catch exception");  
            ret = false;  
            throw e;  
        } finally {  
            System.out.println("testEx, finally; return value=" + ret);  
            return ret;  
        }  
    }  
  
    boolean testEx1() throws Exception {  
        boolean ret = true;  
        try {  
            ret = testEx2();  
            if (!ret) {  
                return false;  
            }  
            System.out.println("testEx1, at the end of try");  
            return ret;  
        } catch (Exception e) {  
            System.out.println("testEx1, catch exception");  
            ret = false;  
            throw e;  
        } finally {  
            System.out.println("testEx1, finally; return value=" + ret);  
            return ret;  
        }  
    }  
  
    boolean testEx2() throws Exception {  
        boolean ret = true;  
        try {  
            int b = 12;  
            int c;  
            for (int i = 2; i >= -2; i--) {  
                c = b / i;  
                System.out.println("i=" + i);  
            }  
            return true;  
        } catch (Exception e) {  
            System.out.println("testEx2, catch exception");  
            ret = false;  
            throw e;  
        } finally {  
            System.out.println("testEx2, finally; return value=" + ret);  
            return ret;  
        }  
    }  
  
    public static void main(String[] args) {  
        TestException testException1 = new TestException();  
        try {  
            testException1.testEx();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

我也掉进了陷阱,选择了:
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=false
testEx1, catch exception
testEx1, finally; return value=false
testEx, catch exception
testEx, finally; return value=false

但是为什么真正的答案是:
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=false
testEx1, finally; return value=false
testEx, finally; return value=false

大致浏览了那篇blog写的不错,但是不知浏览太急还是怎么我没找到这个问题的答案,于是就开始翻 thinking in Java 在电子书(已随blog附件上传)的337页找到了答案。
An even simpler way to lose an exception is just to return from inside a finally clause:
//: exceptions/ExceptionSilencer.java
public class ExceptionSilencer {
public static void main(String[] args) {
try {
throw new RuntimeException();
} finally {
// Using ‘return’ inside the finally block
// will silence any thrown exception.
return;
}
}
} ///:~
If you run this program you’ll see that it produces no output, even though an exception is
thrown.

大致是说你在finally中使用return就会屏蔽掉try块和chatch块中抛出的异常,这将会导致异常的丢失。如果不太理解可以设断点单步跟踪一下,那段代码的具体执行路径就不说了。


二、异常的限制问题

class MyException extends Exception {

}
class T {
	void event() throws MyException {
	}
}

public class StormyInning extends T {
	@Override
	void event() {
	}
	public static void main(String[] args) {
	}
}

这段代码可以通过compiler的正常编译,superclass中方法抛出异常在subclass中覆盖该方法时可以不去抛异常,Java允许在subclass中对异常作出相应处理。如果该方法在superclass和interface中都有相应定义时,就不能再声明抛出什么异常了,否则在使用基类的时候就不能判断是否捕获正确的异常了。

三、IO处理模板
IO处理时资源不释放,资源错误释放都会导致应用出现问题,其实IO处理时是有一定模板可以遵循的。
InputStream input = null;
try {
	input = new FileInputStream(fileName);
	//..process method
} catch (IOException e) {
	log.error(e);
} finally {
	if (input != null) {
		try {
			input.close();
		} catch (IOException e) {
			log.error(e);
		}
		input = null;
	}
}



四、catch异常放置的位置
父类的catch块,必须放置在子类catch块的下方,以防止子类catch被掩盖。虽然编译器也不允许这种错误发生,在高级IDE,比如eclipse中直接就会以红线标出,但是其中的缘由也是有必要知道的。

分享到:
评论

相关推荐

    JAVA基础课程讲义

    JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...

    java 面试题 总结

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性...

    JAVA面试题最全集

    9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中...

    观看韩顺平学习整理java的笔记到异常

    帮助大家复习java基础知识其中有 hashCode 2 toString 2 finalize 2 用已学知识做出简单的房屋出租系统 3 类方法使用注意事项和细节讨论 4 main()方法 4 代码块 4 代码块使用注意事项和细节 5 单例模式 6 final...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...

    AIC的Java课程1-6章

     掌握Java的异常层次结构,辨别checked exception和unchecked exception。  能够分别创建新的异常类,检测抛出异常和捕获处理异常。  认识常见的异常及出现场景。  [*]知道开启和使用断言机制...

    jsr80 java 访问 usb

    在本文中,将对 jUSB 和 JSR-80 项目作一个简要介绍,不过,我们首先要看一下 USB 协议的具体细节,这样您就可以理解这两个项目是如何与 USB 设备交互的。我们还将提供代码片段以展示如何用这两个项目的 API 访问 ...

    超级有影响力霸气的Java面试题大全文档

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...

    java经典面试2010集锦100题(不看你后悔)

    C) Java中的封装就是将对象的数据和操作数据的方法相结合,通过方法将对象的数据和实现细节保护起来。 D) Java语言中的多态的含义可以表达为:对外一个接口,内部多种实现。Java语言支持两种多态:运行时多态和编译...

    Elasticsearch安装部署

    Java的安装,在各个平台上都有差异,所以我们不想在这里深入太多细节。我只想说,在你安装Elasticsearch之前,你可以通过以下命令来检查你的Java版本(如果有需要,安装或者升级): java –version

    用Java实现一个表达式计算器

    public static void main(String[] args) throws Exception { RPN2 rpn = new RPN2(); String str = (5*(4+2)+10)/(4+2*2); System.out.println(str + = + rpn.execute(str)); } } 结果: 代码细节↓ 第一步...

    spring-webflux-binary-response-exception-handling-example

    spring-webflux-binary-response-exception-handle-example 此仓库提供了以下两种情况下返回的406错误的示例(单元测试失败): 异常是从Reactive流中返回的,而不是从控制器方法本身返回的。 当控制器方法产生...

    javaSE整体学习总结,超级全面

    资源包含了,java中亿点点的细节,构成方法重载的条件,内的定义,构造器的四个要点,创建一个对象分为四步,java内部模型,栈的特点,堆的特点,方法区(又叫静态区,也是堆),this的本质,static关键字核心用法,静态的初始化块...

    二十三种设计模式【PDF版】

    会 Java 的人越来越多,但是一直徘徊在语言层次的程序员不在少数,真正掌握 Java 中接口或抽象类的应用不是很多,大家 经常以那些技术只适合大型项目为由,避开或忽略它们,实际中,Java 的接口或抽象类是真正体现 ...

    阿里云java短信验证码源码-tianjin_travel:黑马旅游网项目练习

    阿里云java短信验证码源码 黑马旅游网(web阶段综合练习) 第一天 页面搭建及注册功能 1 项目搭建 1.1 项目介绍 为了巩固web基础知识,提升综合运用能力,故而讲解此案例。要求,每位同学能够独立完成此案例。 1.2 ...

    xCrash::fire:xCrash为Android应用提供了捕获Java崩溃,本机崩溃和ANR的功能。不需要root权限或任何系统权限

    无论是在体系结构还是技术细节上,HexHacking xCrash都将更加激进。 xCrash为Android应用提供了捕获Java崩溃,本机崩溃和ANR的功能。不需要root权限或任何系统权限。 当应用程序崩溃或ANR崩溃时,xCrash可以在您...

    Oracle PL/SQL语言入门

    PL/SQL的出现正是为了解决这一问题,PL/SQL是一种过程化语言,属于第三代语言,它与C、 C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。本文主要介绍PL/SQL的编程基础,以使入门者对PL/SQL...

    异常、线程学习.md

    此文档重在学习java异常及线程的使用与注意细节 1.能够辨别程序中异常和错误的区别 2.虚拟机处理异常的方式 3.能够使用try...catch关键字处理异常 4.能够使用throws关键字处理异常 5.能够自定义异常类 6.说出进程,...

    基于Servlet+JSP+JavaBean开发模式(MVC) 用户注册登陆模式.7z

    (基于MVC模式下web端的开发,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP+JavaBean模式程序各个模块之间层次清晰) 仅供初学者参考,内有文档注释,部分细节不懂者,留言即可

Global site tag (gtag.js) - Google Analytics