Java中的异常?只记得NullPointerException?[通俗易懂]

Java中的异常?只记得NullPointerException?[通俗易懂]开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情 各位小伙伴大家好,我是Java步兵营的二排长。今天,你更博学了嘛?如果没有,那就跟二排长一起看看Java

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

各位小伙伴大家好,我是Java步兵营的二排长。今天,你更博学了嘛?如果没有,那就跟二排长一起看看Java中的异常吧!

image.png

程序员的世界,我们相信用户输入的数据永远是对的、要访问的文件也一定存在、发布的代码永远不会出现bug!!!但是,似乎没人能保证存在这样一个理想的境界。现实世界中总是充满着不良数据和各种有问题的代码,试问谁又能容忍一款程序老是出错呢!so,为了用户的良好体验、项目的运行稳定性、公司的利益。我们必须保证最大限度的阻止异常情况的发生,这就要求我们要做到:

  • 友好的告知用户出现错误
  • 妥善处理工作结果
  • 允许用户以妥善的方式退出程序

好在Java提供了一种称为异常处理的错误捕捉机制(exception handing)来帮助我们最大限度的解决异常问题。

一、异常的识别

为了能处理异常的情况,首先我们必须得搞清楚程序中可能会出现哪些错误,以及我们需要关注得问题有哪些。总的来说,平时我们常遇到的异常大致如下:

  1. 用户输入错误:例如,没有按照要求来输入数据、语法错误等
  2. 设备错误:硬件也有自己的脾气,可能时不时就给你来一个错误
  3. 物理限制:服务器磁盘满了或程序分配的可用空间用完了
  4. 代码错误:程序方法没有按照预期的行径执行,可能返回了一个错误答案、或错误的调用了其他方法

二、异常分类

在Java程序设计语言中,异常对象都是派生自Throwable类的一个实例。除了Java内置的异常类之外,我们还可以自定义异常类。下图是Java异常层级结构简化示意图(这里只是随便列举一些,实际上有很多)

classDiagram
Throwable <|-- Error
Throwable <|-- Exception
Exception <|-- RuntimeException
Exception <|-- IOException
Error <|-- IOError
Error <|-- OutOfMemoryError
Error <|-- NoClassDefFoundError
RuntimeException <|-- AbortException
RuntimeException <|-- AspectException
IOException <|-- AccessException
IOException <|-- ClassFormatException

可以看到所有的异常都是由Throwable继承来的,下一层分为:Error和Exception。

Error类层次结构描述的是Java运行时系统的内部错误和资源耗尽错误。非应用程序错误,这种类型的错误除了通告用户并尽力让程序安全终止外别无他法。不过这种情况出现的概率很少。

Exception类层是我们程序员平时编程时需要注意的层面,这个层次又分为两个分支:IOException分支和RuntimeException分支。怎么区分呢?由程序错误导致的异常属于RuntimeException;程序本身没问题,但由于I/O错误导致问题的属于其他异常。

派生于RuntimeException异常包含如下情况:

  • 错误的类型转换
  • 数据操作越界
  • null指针

派生于IOException异常包含如下情况:

  • 试图在文件尾部后面读取数据
  • 试图打开不存在的文件
  • 试图根据给定字符串查找Class对象,而对应的类不存在

tips:Java语言规范将派生于Error或RuntimeException类的所有异常称为非受查异常(unchecked),其他异常成为受查异常(checked)。

三、异常声明

当我们遇到无法处理的情况,那么我们可以在方法中抛出这个异常。我们不仅需要告诉编译器将要返回什么值,还要告诉编译器有可能发生什么错误。例如,你写了一个读取文件的代码,且考虑到这个文件有可能不存在或内容为空,那么在代码中就需要告知编译器这块代码可能会抛出IOException。

仔细观察源码其实不难发现,很多方法的首部就声明了所有可能抛出的异常。例如,下面是FileInputStream类的一个构造器的声明。

public FileInputStream(String name) throws FileNotFoundException

我们日常自己编写代码时,不必将所有可能抛出的异常都进行声明,不清楚在什么条件需要声明的,可以参考以下4种情况:

  1. 调用的方法上抛出了受查异常,例如:FileNotFoundException
  2. 程序运行过程中发现错误,并且用throw抛出一个受查异常
  3. 程序出现错误,例如数组越界
  4. Java虚拟机和运行时库出现内部错误

如果一个方法有可能抛出多个异常,那方法的首部需要列出所有的异常类。如下所示:

public Image loadImage(String s) throw FileNotFoundException,EOFException{
    ...
}

四、自定义异常类

如果标准异常类中没有符合你自身业务需求的,那么可以创建自己的异常类,我们只需要定义一个派生于Exception的类,或派生于Exception子类的类。定义的类应该包含两个构造器,一个是默认的,一个是带有描述信息的。方便后期调试。

class FileFrmatExcetion extends IOException{
        
    public FileFormatExcetion() {}

    public FileFormatExcetion(String message) {
        super(message);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13660.html

(0)

相关推荐

  • 如何安装pyecharts

    如何安装pyechartsPyecharts是一个基于Python的数据可视化库,适合于各种绘图场景。它的优势是可以轻松地将数据转换成美观的可视化图表,使得数据分析更加清晰明了。

    2024-05-03
    73
  • Python变量命名规则及常见问题

    Python变量命名规则及常见问题在Python中,变量的命名规则是极其灵活的。下面我们来看一下Python变量的命名规则。

    2024-04-11
    69
  • java constructor_java select

    java constructor_java select前面两篇文章介绍了NIO中的Buffer和Channel,有了之前的基础,这篇文章来介绍一下另一个比较重要的概念Selector。我们知道系统线程的切换是消耗系统资源的,如果我们每一个连接都用一个线程来管理,资源的开销会非常大,这个时候就可以用Selector。通过Se…

    2023-08-03
    134
  • oracle 7月份更新 CVE-2020-14625 复现&利用

    oracle 7月份更新 CVE-2020-14625 复现&利用 危害 绕过T3黑名单 ,复活ysoserial gadget利用 diff补丁 首先下载7月份补丁,与四月份对比,发现有以下不同之处 com.oracle.wls.shaded.org.ap…

    2023-03-21
    169
  • flink 流式处理中如何集成mybatis框架

    flink 流式处理中如何集成mybatis框架flink 中自身虽然实现了大量的connectors,如下图所示,也实现了jdbc的connector,可以通过jdbc 去操作数据库,但是flink-jdbc包中对数据库的操作是以ROW来操作并且

    2022-12-19
    147
  • 鬼谷八荒melonloader怎么用_map.remove

    鬼谷八荒melonloader怎么用_map.removeStoneDB 作为开源项目,一直秉持开源开放的基本原则,我们的社区版代码现在已经完全在 Github 上开源,并不断提高代码的可读友好性,同时,为了让大家更好地理解我们是如何打造一款一体化 HTAP

    2023-06-11
    145
  • Pycharm 添加解释器全攻略

    Pycharm 添加解释器全攻略Pycharm 是 Python 开发人员最喜欢的 IDE 之一,它提供了许多有用的功能,如集成的调试器、版本控制、语法突出显示等。在 Pycharm 中,解释器是非常关键的,因为它是与你的项目互动并运行代码的基础。解释器是一个 Python 程序,它能够理解并运行你编写的 Python 代码。Pycharm 支持使用本地或远程解释器。它提供了多种类型的解释器,例如基础解释器、虚拟环境解释器、anaconda 等。在 Pycharm 中,你可以轻松地添加、删除或设置解释器。

    2024-09-07
    25
  • Python正则表达式:强大的文本匹配工具

    Python正则表达式:强大的文本匹配工具正则表达式是一种处理字符串的方法。在文本处理中,经常需要对字符串进行操作,例如字符串的匹配、替换以及删除等操作。Python中的正则表达式库re提供了一套强大的工具,能够对文本进行全面的匹配和操作。

    2024-02-23
    119

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注