一、异常的丢失
任何一个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异常处理机制简介 Java的异常处理机制是其重要的编程特性之一,它采用面向对象的方式处理程序运行过程中可能出现的各种非正常事件。通过这种方式,异常处理代码与正常业务...
CheckedException与RuntimeException是Java异常体系中的两类核心异常。前者要求在编译时必须显式处理或声明抛出,适用于那些可预见且可恢复的异常,如I/O操作失败。后者则表示程序错误或运行时环境问题,无需在编译...
本文将采用轻松幽默的方式,为大家揭示那些在开发中可能被忽略的Java语法细节,帮助大家更好地理解和掌握Java。 #### 十六进制的趣事 在计算机科学领域中,十六进制是一种常用的数字表示方法,它以16为基数,由0-9...
在Java编程语言中,中文字符转换为拼音是一个常见的需求,特别是在处理中文文本的搜索、语音合成或者数据分析等场景。...通过这个程序,你可以更深入地理解Java中如何处理中文字符以及拼音转换的实现细节。
以上规范涵盖了Java开发中命名的基本要求,从这些基本的规范入手,可以帮助开发者构建更加健壮、易读且易于维护的代码库。遵循这些规范,不仅有助于提高个人编程能力,还能促进整个团队的协作和发展。
以下是对标题和描述中所提及的"Java代码优化细节"的详细解读: 1. **语法优化**: - 避免过度使用`==`来比较对象,尤其是字符串,应使用`equals()`方法,因为`==`检查的是引用是否相同,而`equals()`检查内容是否...
以上只是Java 7 API中的一部分关键知识点,实际的API文档包含了更多细节,如各个类的方法、构造函数、枚举值等,以及详细的使用示例,对于学习和使用Java开发来说,是一个非常重要的参考资源。通过阅读这份中文文档...
Java 中有两种主要的异常类型:已检查异常(Checked Exception)和未检查异常(Unchecked Exception)。其中: - **已检查异常**:编译器要求必须显式处理,如 `IOException`。 - **未检查异常**:编译器不要求显式...
在Java中,异常主要分为两大类:`RuntimeException`和`CheckedException`,它们各自承担着不同的角色和功能。 #### 一、机制上的区别 **1. 方法定义与异常声明** 在Java中,`CheckedException`和`...
- 技术细节:利用GB2312编码获取汉字的二进制表示,再根据这些值映射到预设的拼音首字母表中。 2. **字符串操作** - 字符串遍历:遍历输入字符串中的每个字符,逐个进行转换。 - 异常处理:对于非中文字符或无法...
第二题的代码示例展示了Java中的循环控制结构和条件语句的应用。在这个例子中,`for`循环用于重复执行一系列语句直到满足特定条件为止,而`if`语句则用于根据条件的真假决定是否执行特定代码块。`break`关键字用于...
以上只是Java 1.6中文API中的一部分关键知识点,实际的API文档中还包括了更多细节,如各种方法的参数说明、返回值、异常信息等,对于深入理解和使用Java 1.6是非常有价值的。开发者可以通过JDK_API_1_6_zh_CN.CHM...
在Android系统中,应用程序主要基于Java运行时环境进行开发,但也有不少部分是通过Native代码(如C/C++)实现的,这些Native代码通常运行在较低级别的操作系统层面上。当Native代码出现错误时,就会触发Native ...
本篇文章将详细介绍如何在Java中计算两个日期相差几天,并深入探讨示例代码中的关键概念和技术细节。 #### 示例代码分析 给出的示例代码提供了一个名为`Test`的类,该类包含一个名为`dateDiff`的方法,用于计算两...
1. 封装(Encapsulation):Java中的封装是指隐藏对象的实现细节,仅暴露必要的信息。 2. 继承(Inheritance):Java中的继承是指一个类可以继承另一个类的成员变量和成员方法。 3. 多态(Polymorphism):Java中的...
通过“jelf-master”项目,开发者不仅可以学习到ELF文件格式的细节,还能掌握如何在Java环境下处理二进制数据,这对于从事系统级编程、软件逆向工程或者分析Linux系统软件的开发者来说,都是非常宝贵的技能。...
此Java实现包含了详细的注释,以便于读者更好地理解每个步骤和功能的实现细节。 #### 二、ModbusTCP协议基础 ModbusTCP/IP协议是在传统的Modbus RTU或ASCII协议的基础上发展起来的,它保留了Modbus的基本功能,...
在Java中,抽象通过抽象类或接口实现。 - **继承**:继承允许类之间共享属性和方法,减少了代码重复。子类可以从父类继承并根据需要添加或修改特性。 - **封装**:封装是隐藏对象内部细节,只暴露有限的公共接口供...