目录

1 前言

2 异常

2.1 checked and unchecked exceptions

2.2 判断使用checked exceptions or unchecked exceptions?

2.3 checked exceptions的处理操作

2.3.1 throws

2.3.2 如何抛出一个异常

2.3.3 try-catch-finally


1 前言

Java中有两种“Abnormals”——Error和Exception:

Error:描述java中的内部系统错误和java运行系统资源耗尽的情况。面对此种情况,程序员通常无能为力,只能想办法让程序优雅地结束。(例:VirtualMachineError,LinkageError)

Exception(异常):描述你自己程序导致的问题,可以捕获和处理。(例:FileNotFoundException,IOException)

面对Error我们无能为力,因此本文我们就主要关注我们能处理的Exception。

2 异常

2.1 checked and unchecked exceptions

checked exceptions: 必须捕获并指定错误处理handler,否则编译无法通过,类似于编程语言中的static type checking。

unchecked exceptions: 可以不处理,编译不会出现问题,但执行时出现就导致程序失败(代表程序中的潜在bug),类似于编程语言中的dynamic type checking。

2.2 判断使用checked exceptions or unchecked exceptions?

准则:

1.如果客户端可以通过其他方法恢复异常,则采用checked exceptions2.如果客户端对出现的这种异常无能为力,则采用unchecked exceptions3.不要创建无意义的异常,客户应该从checked exception中获取更有价值的信息,利用异常返回的信息来明确操作失败的原因 ; 如果客户仅仅想看到异常信息,可以简单抛出一个unchecked exception

2.3 checked exceptions的处理操作

处理操作中的五个关键词:

throws: 声明本方法中可能会发生某某异常

throw: 抛出某某异常

try, catch, finally: 捕获并处理某某异常

2.3.1 throws

一个java方法遇到无法处理的异常时,会throws这个异常,让调用这个方法的client进行异常进行处理。所以,我们的方法会throws那些异常呢?

1. 其他函数传来的异常:从所调用的函数抛出的checked exceptions

2. 本函数中的异常:当前方法检测到错误并使用throws抛出一个checked exception

考虑到子类型的异常抛出,值得注意的一点是(LSP原则)

1. 如果父类型的方法未抛出异常,则子类型的方法也不能排出异常2. 子类型方法可以抛出更具体的异常,但抛出异常类型一定不能比父类型抛出的异常类型更宽泛

2.3.2 如何抛出一个异常

1. 找到一个可表达错误的Exception类或者构造一个新的Exception类

2. 构造Exception类的实例,将错误信息写入

3. 抛出它(一旦抛出异常,方法不会在将控制权返回给调用它的client,因此也无需考虑返回错误代码)

若此时JDK提供的exception类无法充分描述你的程序发生的错误,可以创建自己的异常类(直接继承Exception类或者Exception的子类)。

例如此时我们构造一个java.lang.Exception的子类:

public class FooException extends Exception{public FooException() {super();}public FooException(String message) { super(message); }public FooException(String message, Throwable cause) {super(message, cause);}public FooException(Throwable cause) { super(cause); }
}      
public void calculate(int i) throws FooException, IOException;

同时调用这个方法的方法必须要么处理这个异常要么继续抛出这个异常(or both)

try{...
} catch(FooException ex) {ex.printStackTrace();System.exit(1);
} catch(IOException ex) {throw new FooException(ex);
}

2.3.3 try-catch-finally

简单的说,try-catch机制负责捕获异常,而finally负责清理异常发生前申请的资源(因为异常抛出后,方法正常执行的代码或被终止)。

下面是三种情况中try-catch-finally的运行机制:

case 1:程序中未抛出异常

case 2: 程序抛出一个异常并被catch捕获

case 3:程序抛出异常但并未被程序中的catch捕获(最后finally执行完会返回到client

同时,这里还有个特殊情况:程序中只使用try-finally。在这种情况中finally中的代码都会被执行,无论try中的是否遇到一个异常,如果遇到一个异常,则会被抛出且必须在别的catch中被捕获。

Java如何抛出异常相关推荐

  1. Java 如何抛出异常、自定义异常、手动或主动抛出异常

    Java 如何抛出异常.自定义异常.手动或主动抛出异常 参考文章: (1)Java 如何抛出异常.自定义异常.手动或主动抛出异常 (2)https://www.cnblogs.com/panchang ...

  2. java 接口 抛出异常_Java接口抛出异常,但接口实现不抛出异常?

    我读到这段代码的接口抛出一个异常,但实现它不抛出一个或赶上一个类,这是为什么?在java中合法还是安全?Java接口抛出异常,但接口实现不抛出异常? import java.rmi.*; public ...

  3. java finally 抛出异常_java的异常处理机制(try catch finally)

    1 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过, 我亲自体验的"教训"告诉我,这个东西可不是想象 ...

  4. java finally 抛出异常_java抛出异常与finally实例解析

    这篇文章主要介绍了java抛出异常与finally实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下: package test1; ...

  5. java怎么抛出异常_java中如何抛出异常使程序不中断(7)

    12.这是java抛出异常的源代码可以直接进行编译运行,希望大家能够从中获益良多. package test; public class YiChang { public static void ma ...

  6. java中抛出异常快捷键_idea中处理异常的快捷键

    建议68:从System.Exception或其他常见的基本异常中派生异常 微软建议:从System.Exception或其他常见基本异常之一派生异常.在Visual Studio中输入Excepti ...

  7. java代码抛出异常_Java中编写代码出现异常,如何抛出异常,如何捕获异常

    异常的产生过程解析 先运行下面的程序,程序会产生一个数组索引越界异常ArrayIndexOfBoundsException.我们通过图解来解析下异常产生的过程. 工具类 classArrayTools ...

  8. java如何抛出异常_java怎么抛出异常

    Java中想要抛出异常那需要用到Java的两个关键字,都是用于异常处理机制. 一个方法不处理这个异常,而是调用层次向上传递,谁调用这个方法,这个异常就由谁来处理.这就是抛出异常. throw :将产生 ...

  9. java catch抛出异常_java异常——捕获异常+再次抛出异常与异常链

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--捕获异常+再次抛出异常与异常链 的相关知识: [1]捕获异常相关 1.1)如果 ...

最新文章

  1. 九章量子计算机 科学杂志,张礼立 : 中国 “九章”量子计算机到底厉害在哪?...
  2. jdk与jre的区别(转)
  3. PHP实现四种基本排序算法
  4. cubase怎么添加midi设备_Cubase教程丨20分钟快速上手Cubase(下)
  5. 百度Logo月度首页人物--王正华:中国低成本航空第一人
  6. deepin深度启动盘制作工具下载地址
  7. android文件导出错误—— failed to pull a selection
  8. 【Kafka】kafka NotLeaderForPartitionException thisserver is not the leader for topic-partition
  9. 2007级计算机技术专科毕业设计,2007级计算机科学与技术本科毕业设计选题
  10. 永不消逝的缓存数据:Adaptec 5445Z RAID卡评测(连载之一)
  11. java并发库之Executors常用的创建ExecutorService的几个方法说明
  12. Kubernetes kubeadm 安装记录
  13. SharePoint自动化系列——创建MMS terms
  14. 【SQL Server】入门教程-基础篇(一)
  15. 分别求数组中奇数和偶数的和
  16. nyoj 543 遥控器 第五届河南省程序设计大赛
  17. 系统设计黄金法则:简单之美
  18. 解决电脑速度慢的问题
  19. 大厂Java岗春招必看:论一个面渣逆袭之路上必学得那些知识点
  20. Windows 下的一款弱网模拟工具NEWT

热门文章

  1. 为什么Linux比windows嵌入式系统
  2. layui页面返回顶部效果
  3. Summer School Homework: C语言 订餐系统(总结)
  4. 编写测试用例基本要求、非功能性测试和状态迁移法介绍
  5. sql server(MSSQLSERVER)服务不能启动 解决办法
  6. sql server08 (mssqlserver)启动不了或者无法登陆三大解决办法
  7. webrtc的DEMO环境搭建
  8. PYQT5 +python3打造文本编辑器
  9. APP Store上架QA注意事项
  10. 二级计算机vfp知识,全国计算机等级考试二级VFP考试大纲