Java异常(Error与Exception)分析与常见异常处理

前言

代码中,我们也看到代码写错了编译器会提示报错,或者编译器没有提示,但是运行的时候报错了,比如前面的数组查询下标超过数组的长度。所以在使用计算机语言进行项目开发的过程中,即使程序员把代码写得很完美, 在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避。

本讲就是讲解如何解决上面的问题,如何让程序报错更加友好。在Java语言中,将程序执行中发生的不正常情况称为"异常"。我们即将讲解什么是异常?异常的分类?怎么去处理异常?

一、什么是异常

在Java语言中,将程序执行中发生的不正常情况称为"异常",异常不是我们开发过程中的语法错误和逻辑错误。

二、异常的分类

1.两大类异常

Error(错误) :是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError(OOM)。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception(异常):是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示"JVM 常用操作"引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。

Exception(异常)分两大类:运行时异常非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

1.运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

2.非运行时异常编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。编译器要求Java程序必须捕获或声明所有编译时异常

2.常见异常

运行时异常无需捕获检查,非必检

数组越界异常:ArrayIndexOutOfBoundsException

空指针异常:NullPointerException

算数异常:ArithmeticException

类转换异常:ClassCastException

非运行时异常(编译异常)必须捕获检查,必检,否则编译器报错

IO异常:FileNotFoundException

三、异常的处理

1.运行时异常处理方式

这种异常,编译器其实不知道的,有可能代码逻辑复杂,程序员自己没注意到可能就会出现。所以对于这种异常我们只能,加强代码规范,多调试,排查解决这些异常。当然,如果我们要强制处理也是可以的。

2.非运行时异常处理方式

这种异常,及时不处理,编译器也会报错,编译器其实就帮助我们选择处理方式了,Java采用的异常处理机制,是将异常处理的程序代码集中在一起, 与正常的程序代码分开,使得程序简洁、优雅,并易于维护,主要有两种处理方式。

方式一:try-catch-finally

结构:

代码案例说明:

javascript 复制代码
public class IOError {

    /**
     * 方法名处理异常
     * @param args
     * @throws FileNotFoundException
     */
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("d:/q11.txt");
        FileInputStream inputStream = new FileInputStream(file);

        //try-catch-finally 处理异常
        try {
            inputStream.read();
        } catch (IOException e) {
            // 打印异常信息,可以在此自定义异常提示
            e.printStackTrace();
        }finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

扩展:如果大家想要了解try-finally的执行顺序的话,可以看一下这篇博客:

juejin.cn/spost/73453...

方式二:throws + 异常类型

该方式直接在方法名或者类名直接对应的异常抛出去,比较简单粗暴,但是我们没发直接去自定义处理异常,只能交给java内部。所以在开发中大部分还是选择try-catch-finally 处理异常,并且在catch自定义异常提示等操作。

总结

本文主要讲解了异常(Error与Exception)与常见异常处理,包括运行时异常和编译异常,以及对于编译异常的两种处理方式。Java异常其实在开发中也是很重要的,在定义接口的,我们经常要对错误的情况进行分析和处理,这样对用户来说会相对更加友好,而不是直接把错误代码暴露出去。

相关推荐
爱勇宝1 小时前
第 1 章:别把“需求文档”当成真正的需求
前端·后端·程序员
IT_陈寒6 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码7 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo7 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志8 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..8 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects8 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰8 小时前
一些基础和问题解决
后端
陈随易8 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN9 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp