一、异常的丢失
任何一个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中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...
抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性...
9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中...
帮助大家复习java基础知识其中有 hashCode 2 toString 2 finalize 2 用已学知识做出简单的房屋出租系统 3 类方法使用注意事项和细节讨论 4 main()方法 4 代码块 4 代码块使用注意事项和细节 5 单例模式 6 final...
在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...
掌握Java的异常层次结构,辨别checked exception和unchecked exception。 能够分别创建新的异常类,检测抛出异常和捕获处理异常。 认识常见的异常及出现场景。 [*]知道开启和使用断言机制...
在本文中,将对 jUSB 和 JSR-80 项目作一个简要介绍,不过,我们首先要看一下 USB 协议的具体细节,这样您就可以理解这两个项目是如何与 USB 设备交互的。我们还将提供代码片段以展示如何用这两个项目的 API 访问 ...
抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...
C) Java中的封装就是将对象的数据和操作数据的方法相结合,通过方法将对象的数据和实现细节保护起来。 D) Java语言中的多态的含义可以表达为:对外一个接口,内部多种实现。Java语言支持两种多态:运行时多态和编译...
Java的安装,在各个平台上都有差异,所以我们不想在这里深入太多细节。我只想说,在你安装Elasticsearch之前,你可以通过以下命令来检查你的Java版本(如果有需要,安装或者升级): java –version
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-handle-example 此仓库提供了以下两种情况下返回的406错误的示例(单元测试失败): 异常是从Reactive流中返回的,而不是从控制器方法本身返回的。 当控制器方法产生...
资源包含了,java中亿点点的细节,构成方法重载的条件,内的定义,构造器的四个要点,创建一个对象分为四步,java内部模型,栈的特点,堆的特点,方法区(又叫静态区,也是堆),this的本质,static关键字核心用法,静态的初始化块...
会 Java 的人越来越多,但是一直徘徊在语言层次的程序员不在少数,真正掌握 Java 中接口或抽象类的应用不是很多,大家 经常以那些技术只适合大型项目为由,避开或忽略它们,实际中,Java 的接口或抽象类是真正体现 ...
阿里云java短信验证码源码 黑马旅游网(web阶段综合练习) 第一天 页面搭建及注册功能 1 项目搭建 1.1 项目介绍 为了巩固web基础知识,提升综合运用能力,故而讲解此案例。要求,每位同学能够独立完成此案例。 1.2 ...
无论是在体系结构还是技术细节上,HexHacking xCrash都将更加激进。 xCrash为Android应用提供了捕获Java崩溃,本机崩溃和ANR的功能。不需要root权限或任何系统权限。 当应用程序崩溃或ANR崩溃时,xCrash可以在您...
PL/SQL的出现正是为了解决这一问题,PL/SQL是一种过程化语言,属于第三代语言,它与C、 C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。本文主要介绍PL/SQL的编程基础,以使入门者对PL/SQL...
此文档重在学习java异常及线程的使用与注意细节 1.能够辨别程序中异常和错误的区别 2.虚拟机处理异常的方式 3.能够使用try...catch关键字处理异常 4.能够使用throws关键字处理异常 5.能够自定义异常类 6.说出进程,...
(基于MVC模式下web端的开发,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP+JavaBean模式程序各个模块之间层次清晰) 仅供初学者参考,内有文档注释,部分细节不懂者,留言即可