【Java】Java中的异常处理:何时抛出异常,何时捕获异常?
参考文章:Java中的异常处理:何时抛出异常,何时捕获异常?
参考文章:Python错误处理-廖雪峰的官方网站
1 异常分类
Throwable对象可以分为两组:
- 一组是unchecked异常,异常处理机制往往不用于这组异常,包括:
- Error类通常是指Java的内部错误以及如资源耗尽的错误。当Error(及其衍生类)发生时,我们不能在编程层面上解决Error,所以应该直接退出程序。
- Exception类有特殊的一个衍生类RuntimeException。RuntimeException(及其衍生类)是Java程序自身造成的,也就是说,由于程序员在编程时犯错。RuntimeException完全可以通过修正Java程序避免。比如将一个类型的对象转换成没有继承关系的另一个类型,即ClassCastException。这类异常应该并且可以避免。
- 另一组是checked异常。这些类是由编程与环境互动造成程序在运行时出错。比如读取文件时,由于文件本身有错误,发生IOException。
2 异常处理机制
异常处理机制try…catch…finally…,代码如下:
try {//可能会有异常的代码} catch (Exception e) {//处理异常或抛新的异常}finally{//释放资源}
2.1 编译器对checked、unchecked异常的处理
public static void CheckedException() throws FileNotFoundException {String NotExistedFilePath="D:/abc.txt";File inFile = new File(NotExistedFilePath);FileReader fileReader = new FileReader(inFile); }public static void CheckedExceptionWithTryCatch() {String NotExistedFilePath="D:/abc.txt";File inFile = new File(NotExistedFilePath);try {FileReader fileReader = new FileReader(inFile);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} }public static int UncheckedException() {int[] s = new int[] { 1, 2, 3 };int tmp;tmp = s[3]; return tmp;}
以上代码中,
- 方法‘CheckedException’声明中未添加‘throws FileNotFoundException’,编译器就会报错。
- 方法‘CheckedExceptionWithTryCatch’,错误被捕获打印,但没有抛出。
- 方法‘UncheckedException’在被运行时,会抛错‘ArrayIndexOutOfBoundsException’。
3 如何使用异常处理机制
Java的异常处理机制异常是一种强大的调试手段,它解决了下三个问题:
- 什么出了错?(异常类型)
- 在哪出的错?(异常堆栈跟踪)
- 为什么出错?(异常信息)
但是如果你没有使用好异常处理机制,即不清楚"何时抛出异常,何时捕获异常,何时处理异常",就不可能很好的解决上述三个问题。以下三大原则可以帮你很好的使用异常处理机制:
- 具体明确(异常类型)
- 提早抛出(1抛更具体的异常类型,2 更好的定位)
- 延迟捕获 (在能处理的时候捕获,而不是把它‘吃掉’)
以下是异常处理细则:
- 如果你不能处理异常,不要捕获该异常。
- 如果要捕获,应在离异常源近的地方捕获它。
- 不要吞没你捕获的异常。(就是捕获的异常,但是什么也不做)
- 除非你要重新抛出异常,否则把它log起来。
- 当一个异常被重新包装,然后重新抛出的时候,不要打印statck trace。
- 用自定义的异常类,不要每次需要抛出异常的时候都抛出java.lang.Exception。方法的调用者可以通过throws知道有哪些异常需要处理–所以它是自我描述的。
- 如果你编写业务逻辑,对于终端用户无法修复的错误,系统应该抛出非检查的异常(unchecked exception);如果你编写一个第三方的包给其他的开发人员用,对于不可修复的错误要用需要检查的异常(checked exception)。
- 绝对不要因为写throws语句会让你用起来不舒服,而不声明需要检查的异常。
- 应用级别的错误或不可修复的系统异常用非检查的异常(unchecked exception)抛出。*(注意是错误,意味着不可修复,比如配置文件错误)
- 根据异常的粒度组织你的方法
【Java】Java中的异常处理:何时抛出异常,何时捕获异常?相关推荐
- C++ 笔记(20)— 异常处理(抛出异常、捕获异常)
异常提供了一种转移程序控制权的方式. C++ 异常处理涉及到三个关键字: try . catch . throw . throw : 当问题出现时,程序会抛出一个异常.这是通过使用 throw 关键字 ...
- java多线程中的异常处理
2019独角兽企业重金招聘Python工程师标准>>> 在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的che ...
- 【转】Java中关于异常处理的十个最佳实践
原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...
- java 异常处理发生异常_Java中的异常处理
java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...
- Java Scanner 类、异常处理 总结
1. Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入,并通过 Scanner 类的 next() 与 nextLin ...
- Java中的异常处理:何时抛出异常,何时捕获异常?
Java中的异常处理:何时抛出异常,何时捕获异常? 参考文章: (1)Java中的异常处理:何时抛出异常,何时捕获异常? (2)https://www.cnblogs.com/tsiangleo/p/ ...
- java 8 lambda表达式中的异常处理
文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...
- java中的异常处理语句_Java中实现异常处理的基础知识
Java中实现异常处理的基础知识 异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. ...
- Java提高篇——Java中的异常处理
对于运行时异常.错误和检查异常,Java技术所要求的异常处理方式有所不同. 由于运行时异常及其子类的不可查性,为了更合理.更容易地实现应用程序,Java规定,运行时异常将由Java运行时系统自动抛出, ...
最新文章
- Deep learning调参经验
- 使用python通过selenium模拟打开chrome窗口报错 出现 您使用的是不受支持的命令行标记:--ignore-certificate-errors...
- C# 加载 SQLite DLL问题
- 【笔记】虚拟机用Xshell登陆报错“ssh服务器拒绝了密码”解决方法
- Windows 技术篇-win+R运行搜索gpedit.msc提示“MMC 不能打开文件”解决方法
- nagios监控mysql主从复制
- java使用POI工具类导出excel
- python中DictVectorizer的使用
- map集合遍历的五种方法
- activiti 工作流设置并行审批_activity、jbpm5、snakerflow常用工作流审批流对比
- 计算机专业基础 -- 数据库系统相关基础知识
- apicloud链接访问本地数据库
- 浏览器实现word在线预览
- NOI题库答案 (1.7 字符串基础)(21 - 25)
- 数据流系列-2-前后端数据传输技巧2
- 数据库安全性和完整性考虑_您是否考虑过云安全性?
- RGB颜色与颜色名称对照表
- C++面向对象总结——数据抽象与数据封装
- 1.14 循环辅助语句
- 孙玉 计算机教授,孙玉
热门文章
- qduoj - 小Z的集训队考验(拓扑排序+动态规划)
- cp分解实现_如何用贝叶斯高斯张量分解修复缺失数据?(Jupyter notebook - Python)
- 在Linux中安装R语言包,遇到无法验证下列签名的错误
- 12.映射表map.rs
- python3 Async/Await入门指南
- Word/Excel文档伪装病毒-kspoold.exe分析
- 关于寻路算法的一些思考(1):A*算法介绍
- 恢复SQLSERVER被误删除的数据
- QEMU 构建系统架构
- 容器化技术如何在数据中心实践