【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常——捕获异常+再次抛出异常与异常链 的相关知识;

【1】捕获异常相关

1.1)如果某个异常发生的时候没有再任何地方进行捕获, 那程序就会运行终止: 并在控制台上打印出异常信息 , 其中包括异常的类型堆栈的内容;

1.2)要想捕获一个异常, 必须设置 try/catch 语句块:

1.2.1)如果在try语句块中抛出了一个在 catch子句中声明的异常类, 那么case1)程序将跳过try 语句块的其余代码;

case2)程序将执行 catch 子句中 的处理器代码;

1.2.2)如果在try语句块中没有抛出任何异常, 那么程序将跳过 catch子句;

1.2.3)如果方法中的任何代码抛出了一个在 catch 子句中没有声明的异常类型, 那么这个方法就会立刻退出;

1.3)看个荔枝: (看一个读取文本的程序代码以演示捕获异常的处理过程)

public void read(String filename)

{

try

{

InputStream in = new FileInputStream(filename); // 创建输入流

int b;

while((b=in.read()) != -1)

process input

}

catch(IOException exception)

{

exception.printStackTrace(); // 打印栈轨迹;

}

}

对上述代码的分析(Analysis):

A1)需要注意的是, try 语句中的大多数代码都很容易理解, 读取并处理文本行, 直到遇到文件结束符为止;(read 方法可能抛出一个IOException异常)

A2)在这种情况下, 将跳出整个while循环, 进入 catch子句, 并生成一个 栈轨迹;

1.4)对于一个普通 的程序来说, 处理以上的对异常处理的方法外,还有其他方法吗?

1.4.1)通常, 最好的选择是: 什么也不做, 而是将异常传递给调用者;如果read方法出现了错误, 那就让read方法的调用者去处理。

1.4.2)如果采用这种方式, 就必须声明这个方法可能抛出一个 IOException(将异常传递给调用者);

public void read(String filename) throws IOException

{

InputStream in = new FileInputStream(filename); // 创建输入流

int b;

while((b=in.read()) != -1)

process input

}

Attention)编译器严格地执行 throws 说明符。 如果调用了一个抛出已检查异常的方法, 就必须对它进行处理, 或者将它继续进行传递;

1.5)对于以上两种处理异常的方法, 哪种 方法更好呢?(method1:自己处理(在可能发生异常的函数中添加try/catch 语句块);method2:将异常传递(throw)给调用者,调用者处理)

1.5.1)通常, 应该捕获那些知道如何处理的异常, 而将那些不知道怎么处理的异常继续进行传递;如果想传递一个异常, 就必须在方法的首部添加一个throws 说明符, 以便告知调用者这个方法可能会抛出异常;

1.5.2)阅读API后, 以便知道这个方法可能会抛出哪种异常, 然后再决定是自己处理, 还是添加到 throws 列表中;

Attention)以上规则有个例外: 前面提到, 如果编写一个 覆盖超类的方法, 而这个方法又没有抛出异常, 那么这个方法就必须捕获方法代码中出现的每一个已检查异常。不允许在子类的 throws 说明符中出现超过超类方法所列出的异常类范围;(也就是说父类方法没有抛出异常,你子类方法也不准抛出异常,只能自己添加 try/catch 语句块自己处理)

【2】捕获多个异常

2.1)在一个try 语句块中可以捕获多个异常, 并对不同类型的异常做出不同的处理。可以按照下列方式为每个异常类型使用一个单独的 catch 子句;

try

{}

catch(FileNotFoundException e)

{}

catch(UnknownHostException e)

{}

catch(IOException e)

{}

2.2)要想获得异常对象 的更多信息: 可以试着使用 e.getMessage() 得到详细的错误信息, 或者使用 e.getClass().getName(); 得到异常对象 的实际类型;

2.3)合并catch 子句: 在 java SE7中, 同一个 catch 子句中可以捕获多个异常类型。 例如, 假设对应缺少文件和 未知主机异常的动作是一样的, 就可以合并catch 子句:

try

{}

catch(FileNotFoundException | UnknownHostException e)

{}

catch(IOException e)

{}

Attention)

A1)只有当捕获的异常类型彼此间不存在子类关系时 才需要这个特性;

A2)捕获多个异常时, 异常变量隐含为 final变量。例如, 不能在以下子句体中为 e 赋不同的 值;

catch(FileNotFoundException || UnknownHostException e) {}

A3)捕获多个异常不仅会让你的代码看起来简单, 还会更高效。生成的字节码只包含一个对应公共catch 子句的代码块;

【3】再次抛出异常与异常链

3.1)在catch子句中可以抛出一个异常, 这样做的目的是 改变异常类型;

3.1.1)看个荔枝:

try

{}

catch(SQLException e)

{

throw new ServletException("data error : " + e.getMessage());

}

对以上代码的分析(Analysis):

A1)这里, ServletException 用带有异常信息文本的构造器来构造;

A2)不过, 可以有一种更好的方法, 并且将原始异常设置为新异常的原因:

try

{}

catch(SQLException e)

{

Throwable se = new ServletException("database error");

se.initCause(e);

throw se;

}

A3)当捕获到这个异常时, 就可以使用下面的语句重新得到 原始异常:

Throwable e = se.getCause();

Attention)强烈建议使用这种包装技术, 这样可以让用户抛出子系统中的高级异常, 而不会丢失原始异常的小细节; (推荐使用 strongly recommended)

Hint)

H1)如果在一个方法中发生了一个已检查异常,而不允许抛出它, 那么包装技术就十分有用。 我们还可以捕获这个已检查异常, 并将它包装成一个 运行时异常;

H2)有时候, 你可能只想记录一个异常,再将它重新抛出, 而不做任何改变:

try

{

access the database

}

catch(Exception e)

{

logger.log(level, message, e);

throw e;

}

H3)在Java SE7 之前, 将上述代码放入下述方法中, 会出现一个问题;

public void updateRecord() throws SQLException

因为, java 编译器查看catch 块中的 throw 语句, 然后查看e的类型, 会指出这个方法可以抛出任何Exception而不仅仅是 SQLException;

H4)java se 7之后(编译器检测语法合法): 编译器会跟踪到 e 来自于try块中, 假设这个 try 块中仅有 的已检查异常 是 SQLException实例, 另外,假设e在catch块中未改变, 将外围方法声明为 throws SQLException 就是合法的;

java catch抛出异常_java异常——捕获异常+再次抛出异常与异常链相关推荐

  1. java异常——捕获异常+再次抛出异常与异常链

    java异常--捕获异常+再次抛出异常与异常链 参考文章: (1)java异常--捕获异常+再次抛出异常与异常链 (2)https://www.cnblogs.com/jpfss/p/9454592. ...

  2. java catch后面_java 异常被catch后 将会继续执行的操作

    我就废话不多说了,大家还是直接看代码吧~ import java.util.UUID; public class Test { public static void main(String[] arg ...

  3. java catch自定义异常_java异常类-java自定义异常-嗨客网

    Java异常类教程 我们在 我们可以看到,在 Exception 表示的是程序中出现了问题,可以直接使用 try - catch 来捕获处理.Error 一般值 Java常见异常 类名 描述 IOEx ...

  4. java如何抛出异常_java中 方法中抛出异常处理方法

    展开全部 Java语言提供e69da5e887aa62616964757a686964616f31333366306461两种异常处理机制:捕获异常和声明抛弃异常. 1.捕获异常: (1)在Java程 ...

  5. java开发原则_java开发中,大家处理异常的原则是什么,是如何处理的?

    展开全部 最熟悉的陌生人:异常 异常的类e5a48de588b63231313335323631343130323136353331333361326365型Throwable - Exception ...

  6. java 语法错误_java菜鸟提问:编译时异常和语法错误的区别?

    语法错误是你真写错了,比如"All the people here work hardly."这句话就是语法错误,hard也可用作副词,所以"All the people ...

  7. java catch用法_java – 如何避免使用try … catch块

    我理解这些是必要的--当然要编写正确的代码,但是有没有一种设计模式可以帮助避免在类中重复尝试- catch块?例如,我编写了一个抛出5个不同异常的特定类. public void iterateCom ...

  8. java catch 空指针异常_java空指针异常怎么处理

    继续修改该类中的代码为: public class HelloWorld { public static void main(String[] args) { String str1 = null; ...

  9. java wsimport 调用_java – 使用wsimport时的安全性异常

    我想从wsdl文件生成存根文件,该文件可通过带有自签名证书的ssl连接访问. 当我在ant中执行此操作时,我收到此错误: generate-from-wsdl: [exec] parsing WSDL ...

最新文章

  1. 互联网协议 — DNS 缓存机制
  2. leetcode算法题--大礼包
  3. Bootstrap – 1.认识
  4. 习惯 积累 沉淀
  5. CentOS 初体验十四:阿里云安装Gitlab
  6. mysql忘记root密码咋办_MySQL忘记root用户密码怎么办?
  7. word把选择答案弄到题目里_word中把选择题的正确答案自动填到括号里技巧
  8. python从云端服务器读数据_audio 读取服务器文件
  9. UI实用素材模板|app底部导航栏的图标可临摹素材,教你分析!
  10. 超强1000个jquery极品插件!
  11. [POI2007]ODW-Weights(贪心)
  12. JavaWeb复习题(含答案)
  13. JavaScript模态框实现
  14. 机器学习知识总结 —— 8. 什么是有监督学习、无监督学习、半监督学习
  15. Google推荐的图片加载库Glide介绍
  16. 2003英语单词四6级大学六级CET6资料
  17. jsp文件木马代码分析
  18. opencv(人脸检测和识别)
  19. JavaSE【定制化】~ 基础篇
  20. 通过sql语句查询oracle版本信息

热门文章

  1. SpringBoot学生成绩管理系统
  2. 多重系统的引导文件详解
  3. python抖音粉丝_告别刷抖音!30秒一个Python小例子,总有一款适合你
  4. Mybatis : DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
  5. sas java_Sas java环境变量配置
  6. 2014-02-27 23:00 2014年最新GHOST_win7_64位旗舰版系统下载
  7. 专利与论文-2:什么是专利?专利的几种类型?
  8. javaWeb项目 打印日志
  9. JavaScript高级程序设计 第4版 -- 操作符
  10. asp.net 文件上传和下载管理源码