Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初识JAVA:异常处理

初识JAVA:异常处理

作者头像
葆宁
发布于 2022-05-06 09:10:03
发布于 2022-05-06 09:10:03
25200
代码可运行
举报
文章被收录于专栏:FREE SOLOFREE SOLO
运行总次数:0
代码可运行

一、 处理原则

Java异常代码中我们使用异常的目的是让异常的异常类型来提示“什么”被抛出了— 即出了什么问题;用异常的栈打印信息来跟踪异常在“哪里”抛出 — 即哪里出了问题;

异常提示信息来提示“为什么”会抛出 — 即出问题的原因。在对异常进行处理时,遵循以下原则可以有助于在调试过程中最大限度的使用好异常。

具体明确 提早抛出 延迟捕获

1.具体明确

具体明确指的是在抛出异常时需要针对具体问题来抛出异常,抛出的异常要足够具体详细;在捕获异常时需要对捕获的异常进行细分,这时会有多个catch语句块,这几个catch块中间泛化程度越低的异常需要越放在前面捕获,泛化程度高的异常捕获放在后面,这样的好处是如果出现异常可以近可能得明确异常的具体类型是什么。  例如 FileInputStream 的一个构造方法如下, 对file对象做检查后判断file是否有效,如果无效直接抛出FileNotFoundException,而不是IOException或者其他更宽泛的Exception。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public FileInputStream(File file) throws FileNotFoundException {
        String name = (file != null ? file.getPath() : null);
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(name);
        }
        if (name == null) {
            throw new NullPointerException();
        }
        if (file.isInvalid()) {
            throw new FileNotFoundException("Invalid file path");
        }
        fd = new FileDescriptor();
        fd.attach(this);
        path = name;
        open(name);
    }

2.提早抛出

提早抛出的基本目的还是为了防止问题扩散,这样出现异常的话排查起来会比较耗时,比较典型的一种情况是 NPE(NullPointerException),当某个参数对象为null时,如果不提早判断并抛出异常的话,这个null可能会藏的比较深,等到出现NPE时就需要往回追溯代码了。这样就给排查问题增加了难度。所以我们的处理原则是出现问题就及早抛出异常。

例如 上面FileInputStream 的构造方法,在使用前就对File 的path做了判断,如果为null 就及早的抛出NullPointerException,防止在后面open方法中传入一个null,从而简化了出现异常的情况,方便定位问题。

3.延迟捕获

延迟捕获说的是对异常的捕获和处理需要根据当前代码的能力来做,如果当前方法内无法对异常做处理,即使出现了检查异常也应该考虑将异常抛出给调用者做处理,如果调用者也无法处理理论上他也应该继续上抛,这样异常最终会在一个适当的位置被catch下来,而比起异常出现的位置,异常的捕获和处理是延迟了很多。但是也避免了不恰当的处理。

二 、 处理技巧

对于异常的处理,能避免的异常,尽量在事先做判断来避免异常的发生,当判断时发现逻辑上已经不能往下走了,需要停止流程,这时候将异常抛出并准确的提示使用者问题所在。

对于事先无法预判的异常需要对其进行处理。

异常分运行时异常 RuntimeException 和 检查异常Checked Exception,运行时异常一般用在由于接口方法使用不当的时候。

如: 使用了null获取属性方法, 数组下标越界,除法运算除以0等。

如果你调用服务方法的方式不正确,你应该马上修改代码,避免发生RuntimeException 如果是用户方法调用你的方法的方式不正确,你应该立刻抛出RuntimeException,强制让使用者修正代码或改变使用方式,防止问题蔓延。

一般情况下,不要捕获或声明RuntimeException,需要做的是完善程序代码。因为问题在于你的程序本身有问题,如果你用异常流程处理了,反而让正常流程问题一直存在。

对于检查异常,一般先看能不能处理,能处理的异常使用try-catch 语句块捕获处理,不能处理使用throws 分类型抛出给上一级处理。

使用try-catch语句块处理时一般需要注意以下几方面

try语句块内要分清稳定代码和非稳定代码,对于稳定的不会出现异常的代码不要放到try语句块中catch捕获的异常一定要处理。 若使用了finally 语句块,在语句块内一定要对资源对象,流对象进行关闭(jdk1.7之后 可以使用try-with-resources替代)、finally中不要使用return语句,因为finally语句块最后一定会执行,这里的return语句会覆盖之前的return语句。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解 java 异常处理机制
原文 https://blog.csdn.net/hguisu/article/details/6155636
猿芯
2021/05/27
6250
深入理解 java 异常处理机制
[ Java学习基础 ] Java异常处理
一、异常概述   异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。   异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据。 要打开的文件不存在。 网络通信时连接中断,或者JVM内存溢出。   这些异常有的是因为用
Kevin_Zhang
2018/05/22
2K0
Java复习 【知识改变命运】第七章
当执行到num1/num2时候就会抛出一个异常,ArithmeticException,当抛出异常后程序就崩溃掉,不会执行下面的代码了
用户11319080
2024/11/21
650
Java复习 【知识改变命运】第七章
Java异常处理
异常:在Java语言中,将程序执行中发生的不正常情况称为“异常” 开发过程中的语法错误和逻辑错误不是异常)
Java_慈祥
2024/08/06
1250
Java异常处理
Java异常处理和设计
在程序设计中,进行异常处理是非常关键和重要的一部分。一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能。因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基础的知识,然后给出在进行Java异常处理设计时的几个建议。
Java团长
2018/08/07
6290
Java学习笔记(四):异常处理
异常,就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响。
foochane
2020/02/13
6260
一文读懂 JAVA 异常处理
Throwable 是所有异常类型的基类,Throwable 下一层分为两个分支,Error 和 Exception.
java架构师
2019/03/04
1.1K0
一文读懂 JAVA 异常处理
Java 异常处理下篇:11 个异常处理最佳实践
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2023/12/15
6015
《JavaSE》---18.<异常处理>
1. Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
用户11288958
2024/09/24
1080
《JavaSE》---18.<异常处理>
Java异常面试题(2020最新版)
Java异常架构与异常关键字Java异常简介Java异常架构1. Throwable2. Error(错误)3. Exception(异常)运行时异常编译时异常
用户7886150
2020/12/18
8070
【Java】异常处理指南
异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:
IsLand1314
2024/10/15
2170
【Java】异常处理指南
【Java ——异常机制详解】
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
奥耶可乐冰
2024/05/31
2860
Java程序设计(高级及专题)- 异常机制「建议收藏」
在程序运行过程中出现错误,导致程序出现非预期场景。异常处理可以保证出现错误后,控制接下来的程序流程,是选择定位错误信息,还是抛出异常或捕获异常、还是避免程序非正常退出,都取决于我们。
全栈程序员站长
2022/08/04
5650
Java程序设计(高级及专题)- 异常机制「建议收藏」
Java 异常处理下篇:11 个异常处理最佳实践
闻说社
2024/11/11
1990
Java 异常处理下篇:11 个异常处理最佳实践
Java异常Exception详解
将可能出现异常的代码块选中->快捷键 ctrl + alt + t -> 选中 try-catch
timerring
2023/04/21
5590
Java异常Exception详解
认识JAVA中的异常
1 异常的概念:在 Java 中,将程序执行过程中发生的 不正常行为 称为异常,
用户11305962
2024/10/09
1220
认识JAVA中的异常
Java异常处理和设计
在程序设计中,进行异常处理是非常关键和重要的一部分。一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能。因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基础的知识,然后给出在进行Java异常处理设计时的几个建议。
Spark学习技巧
2019/05/09
1K0
Java异常处理和设计
Java异常处理最佳实践
在Java中处理异常并不是一个简单的事情。不仅仅初学者很难理解,即使一些有经验的开发者也需要花费Java
Java架构师必看
2021/07/15
7730
二、异常日志 (一) 异常处理
(一) 异常处理 【强制】Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理,比如:NullPointerException,IndexOutOfBoundsException等等。 说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,不得不通过catch NumberFormatException来实现。  正例: if (obj != null) {...} 反例: try { obj.method() } catch (Nu
凯哥Java
2022/12/15
5020
深入理解java异常处理机制
 1. 引子        try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。 <span style="background-color: rgb(255, 255, 255);">package T
大闲人柴毛毛
2018/03/09
9600
深入理解java异常处理机制
相关推荐
深入理解 java 异常处理机制
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验