(事先声明:该文章并非完全是我自己的产出,更多的是我个人在看到资料后通过理解并记录下来,作为自己阅读后的一个笔记;我现在试图对自己多年工作中的知识点做一个回顾,希望能融会贯通)

(此文参考<Java核心技术36讲>第二讲)

Exception & Error

Java的Exception和Error都继承了Throwable,且仅有Throwable类能被抛出(throw)和捕获(catch)。

Error是指正常情况下不会发现的,并且发现后无法恢复;此类错误不需要捕获,如:OutOfMemoryError,StackOverflowError,正常代码中无法对此类错误进行捕获。

Exception一搬是指程序运行是出现的意外情况 - 该事件发生是在意料之中的,且有可能恢复;可以进行捕获并相应处理。如: NumberFormatException, ValidateException(自定义).  异常又分为可检查(checked)和不检查(un-checked)。

1. Checked:在编译时会强制要求进行捕获,如在方法中有定义抛出的异常,则调用该方法时需要捕获该异常并进行处理。

    public void methodA() throws ValidateException {
// do thing
throw new ValidateException("Number exception");
} public void handleException() {
ExceptionHandling eh = new ExceptionHandling();
eh.methodA(); // <--- need catch the exception here
}

2. Un-checked:  运行时出现的异常,如在处理对象时发现对象为空(NullPointException),或者ClassCastException,此类异常通常不会在编译时要求显式处理。而是根据代码实现者的具体实现来捕获。

Exception处理 - try-with-resources

基本的语法有 try-catch-finally, throw new xxxException("Exception message"),  throws xxxException (方法定义).

Java7之后,引入了try-with-resources: 当一个外部资源实现了Autocloseable / Closeable接口时,可以将原来复杂的try-catch-finally-try-catch替换成自动关闭。

旧的实现:

public void readFile(String fileName) {
FileInputStream is = null;
try {
is = new FileInputStream(new File(fileName));
log.info("File content:\n {}", is.read());
} catch(IOException e) {
throw new RuntimeException(e.getMessage, e);
} finally {
if(is != null) {
try {
is.close();
} catch (IOException e1) {
throw new RuntimeException(e1.getMessage, e1);
}
}
}
}

新实现:

public void readFile(String fileName) {
try (FileInputStream is = new FileinputStream(new File(fileName))) {
log.info("File content:\n {}", is.read());
} catch (IOException e) {
throw new RuntimeException(e.getmessage, e);
}
}

Exception处理 - Multiple exception

try {
// do sth
} catch (IOException | ValidateException) {
// handle exception here
}

日常使用建议

在日常编写代码过程中,处理异常应该尽量遵循一些好的经验。

尽可能捕获具体的异常,而不通用异常: 如Catch(NumberFormatException e), 而不是Catch(Exception e)

不要吞掉异常(Swallow Exception),应该输出有用的信息。

尽早抛出异常,比如在正常代码里,如果一行代码包含多个对象且出现NPE时, 很难判断是哪个对象为空,因此可以在有可能出现对象为空且该对应一定不能为空时增加测试条件:

Preconditions.checkNotNull(neme, "neme can't be null");

Java Exception 和Error的更多相关文章

  1. Java Exception 和Error有什么区别?

    ① Exception 和Error 都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型. ② Exception和Error ...

  2. Java Exception和Error的差别

    Java中异常的抽象类是Throwable,在此基础上.派生出两大类:Error和Exception. Error是程序中的严重错误,不应该用try-catch包括.Javadoc的说明例如以下: A ...

  3. 面试官:小伙子,你给我说一下Java Exception 和 Error 的区别吧?

    前言 昨天在整理粉丝给我私信的时候,发现了一个挺有意思的事情.是这样的,有一个粉丝朋友私信问我Java 的 Exception 和 Error 有什么区别呢?说他在面试的时候被问到这个问题卡壳了,最后 ...

  4. nested exception is java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'daoSupport': ...

  5. java 异常处理 Throwable Error 和Exception

    Java异常类层次结构图:       异常的英文单词是exception,字面翻译就是“意外.例外”的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误. 比如使用 ...

  6. Kafka中错误:Unrecognized VM option ‘UseCompressedOops’ Error: Clould not create the Java Vritual Machine. Error: A fatal exception has occurres . Program will exit.

    错误的描述: 在kafka安装目录下,执行 $ bin/zookeeper-server-start.sh config/zookeeper.properties & Unrecognized ...

  7. Java的Exception和Error面试题10问10答

    在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题.Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它 ...

  8. 谈一谈Java中的Error和Exception

    Error和Exception的联系 继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Exception. Error和RuntimeExc ...

  9. java virtual machine launcher Error:Could not create the Java Virtual Machine. Error:A Fatal exception has occurred,Program will exit.

    Error:Could not create the Java Virtual Machine. Error:A Fatal exception has occurred,Program will e ...

随机推荐

  1. vs code 本地请求json

    首先下载扩展live server 重新加载后 右下方工具栏会多出一个go live 点击go live,会默认启动chome,地址  http://127.0.0.1:5500 js脚本: $.aj ...

  2. mysql 实现 sqlserver的row_number over() 方法

    1.创建表 CREATE TABLE `heyf_t10` ( `empid` int(11) DEFAULT NULL, `deptid` int(11) DEFAULT NULL, `salary ...

  3. Log Filter分析

    1 log filter analysis分析 filter:与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中.但是与其他web应用程序组件不同的是,过滤器是&qu ...

  4. 学习笔记--python中使用多进程、多线程加速文本预处理

    一.任务描述 最近尝试自行构建skip-gram模型训练word2vec词向量表.其中有一步需要统计各词汇的出现频率,截取出现频率最高的10000个词汇进行保留,形成常用词词典.对于这个问题,我建立了 ...

  5. SERvet的表单

    首先要建立好数据库. 好了,先写好两个静态页面,分别负责登录和注册. 代码清单1:login.jsp(登录页面) <%-- Document : login Created on : 2013- ...

  6. Scrum学习心得

    一.Scrum学习心得: 最近简单的学习了一下scrum模式,感觉又开启了一个新世界的大门. 首先,scrum是一个应用于互联网研发的开发方式,这种开发方式的主要特点是快速迭代,持续交付. scrum ...

  7. Alisha’s Party (HDU5437)优先队列+模拟

    Alisha 举办聚会,会在一定朋友到达时打开门,并允许相应数量的朋友进入,带的礼物价值大的先进,最后一个人到达之后放外面的所有人进来.用优先队列模拟即可.需要定义朋友结构体,存储每个人的到达顺序以及 ...

  8. JavaScript中函数引用调用和函数直接调用的区别

    首先看下面的代码: var x = 1 var f1 = function( f ) { var x = 2 ; f( ' console.log( x ) ' ) } var f2 =  funct ...

  9. [Java Web学习]JDBC事务处理

    1. Spring中加入数据库的bean <bean id="dataSource" class="org.apache.commons.dbcp.BasicDat ...

  10. SQL学习 存储过程&DUAL表

    CREATE OR REPLACE PROCEDURE 存储过程 转自 https://www.cnblogs.com/lideng/p/3427822.html oracle中dual表的用途介绍 ...