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)

相关推荐

发表回复

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