JAVA入坑之异常处理

news2024/12/25 1:03:06

目录

一、程序错误

二、异常

2.1概述

2.2产生原因

2.3Java 异常层次结构

Error

Exception

2.3.1非受检异常

2.3.2受检异常

 三、异常处理机制

3.1概述

​编辑

调用栈Call Stack

3.2异常类型的实现

3.3异常处理的关键字:

3.3.1try-catch Block

​编辑

补充块变量的作用范围

补充Try-catch的执行顺序

3.3.2Throwable 类常用方法

3.3.3finally 块

3.3.4try-with-resources语句

3.3.5 throw和throws 关键字

3.3.6自定义异常


一、程序错误

在Java程序中,错误通常分为三类:编译时错误、运行时错误和逻辑错误。

1.编译时错误:编译时错误是指在编译Java程序时发生的错误。这些错误通常是由于语法错误或类型不匹配等问题导致的。例如,下面的代码将无法通过编译,因为它试图将一个字符串赋值给一个整型变量:

int x = "hello"; // 编译时错误

2.运行时错误:运行时错误是指在程序运行过程中发生的错误。这些错误通常是由于程序中的异常情况导致的,例如除以零、空指针引用等。运行时错误会导致程序崩溃并抛出异常。例如,下面的代码将在运行时抛出ArithmeticException异常,因为它试图除以零:

int x = 10 / 0; // 运行时错误,抛出ArithmeticException异常

3.逻辑错误:逻辑错误是指程序虽然能够正常编译和运行,但是其行为与预期不符。这些错误通常是由于程序员在编写代码时犯了逻辑错误导致的。例如,下面的代码本意是计算两个数的平均值,但由于程序员犯了一个简单的逻辑错误,导致结果不正确:

int x = 10;
int y = 20;
int average = x + y / 2; // 逻辑错误,应该写成 (x + y) / 2

二、异常

2.1概述

异常是程序执行期间发生的意外事件。它影响程序指令流,从而导致程序异常终止。

2.2产生原因

  • 无效的用户输入
  • 设备故障
  • 网络连接丢失
  • 物理限制(磁盘内存不足)
  • 代码错误
  • 打开一个不可用的文件

2.3Java 异常层次结构

0ac8bc6b33944b01b822a6e0a987e8a0.jpg

 从上图可以看到,Throwable类是层次结构中的根类。

请注意,层次结构分为两个分支:错误(Error)和异常(Exception)。

Error

Error表示不可恢复的情况,例如Java虚拟机(JVM)内存不足,内存泄漏,堆栈溢出错误,库不兼容,无限递归等。

错误通常是程序员无法控制的,我们不应该尝试处理错误。

出现严重的,无法恢复运行状态的错误,出现错误后一般只能进行详细的日志记录汇报

Exception

程序可以捕获并处理异常。

当方法内发生异常时,它将创建一个对象。该对象称为异常对象。

它包含有关异常的信息,例如异常的名称和说明以及发生异常时的程序状态。例如空指针访问 试图读取不存在的文件 网络连接中断

分类:受检(编译时)异常和非受检(运行时)异常

2.3.1非受检异常

非受检异常(运行时异常) 是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。 对于这类异常,可以不作处理或者加上逻辑判断

运行中不应该出现而又出现的问题,此类异常一般是由于代码(逻辑)错误(不严谨)产生的,不应通过捕获异常处理,而应通过修正代码更正错误解决

2.3.2受检异常

是指要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求java程序必须捕获或声明所有编译时异常。 对于这类异常,如果程序不处理,可能会带来意想不到的结果。

一般为程序与程序控制之外的外部资源互交时,产生的错误 如文件无法读取,数据库无法访问,网络无法连接等 程序必须为可能出现的受检异常,提供异常处理程序,从而使程序可以继续运行而非停止崩溃

2.3.3常用异常:

 三、异常处理机制

3.1概述

异常处理机制是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况,即超出程序正常执行流程的某些特殊条件。它让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。

调用栈Call Stack

调用栈(Call Stack)是计算机内部一种用来跟踪程序运行状态的数据结构,类似于人们在日常生活中的“记事本”,记录了程序在运行过程中每一个函数调用的位置、参数和返回值等信息。它是计算机科学中存储有关正在运行的子程序的消息的栈

3.2异常类型的实现

 Java提供了3种主要的异常类型的实现

  1. java.lang.Error,继承自Throwable,
  2. 非受检 java.lang.Exception,继承自Throwable,受检异常
  3. java.lang.RuntimeException ,继承自Exception,运行时异常,非受检异常

java.lang.Throwable类,所有错误/异常的超类,仅Throwable及其子类对象可以被catch语句捕获

 

3.3异常处理的关键字:

异常处理的关键字:

捕获异常:

  1. try:执行可能产生异常的代码;
  2. catch:捕获异常;
  3. finally:无论是否发生异常,代码总被执行;

抛出异常:

  1. throw:异常生成阶段,手动抛出异常对象;

声明异常:

  1. throws声明方法可能要抛出的各种异常类

3.3.1try-catch Block

public class Example {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        try {
            // 尝试访问数组中不存在的元素
            System.out.println(numbers[3]);
            // 尝试将整数除以零
            System.out.println(3 / 0);
        } catch (ArrayIndexOutOfBoundsException e) {
            // 捕获并处理数组越界异常
            System.out.println("数组越界!");
        } catch (ArithmeticException e) {
            // 捕获并处理算术异常
            System.out.println("算术异常!");
        }
    }
}

将多个可能引发异常的代码 置于一个try块中 顺次声明多个catch与之关联

在try代码块与catch代码块之间,禁止定义其他代码

补充块变量的作用范围

块变量(也称为局部变量)是在代码块(如方法、循环或条件语句)中定义的变量。它们的作用范围仅限于定义它们的代码块。当代码块执行完毕后,块变量将不再可用。

public class Example {
    public static void main(String[] args) {
        // 定义一个块变量
        int x = 10;
        if (x > 5) {
            // 定义另一个块变量
            int y = 20;
            System.out.println("x: " + x + ", y: " + y);
        }
        // 这里无法访问块变量 y,因为它已经超出了作用范围
        System.out.println("x: " + x);
    }
}

补充Try-catch的执行顺序

3.3.2Throwable 类常用方法

Throwable 类是 Java 语言中所有错误或异常的超类。它包含了一些常用的方法,可以帮助我们获取有关异常的信息,以下是一些常用的方法:

  • getMessage():返回此 throwable 的详细消息字符串。
  • printStackTrace():将此 throwable 及其追踪输出至标准错误流。这个方法会打印出异常的类型、详细消息以及异常发生时的堆栈信息。
  • toString():返回此 throwable 的简短描述。这个方法返回的字符串包含了异常的类型和详细消息。
  • getCause():返回此 throwable 的原因。如果原因不存在或未知,则返回 null。
public class Example {
    public static void main(String[] args) {
        try {
            // 尝试将整数除以零
            System.out.println(3 / 0);
        } catch (ArithmeticException e) {
            // 获取并打印异常信息
            System.out.println("异常类型: " + e);
            System.out.println("异常信息: " + e.getMessage());
            System.out.println("堆栈信息: ");
            e.printStackTrace();
            System.out.println("原因: " + e.getCause());
        }
    }
}

3.3.3finally 块

finally 块是与 try-catch 语句一起使用的一个可选代码块。它包含的代码无论是否发生异常都会被执行。通常,我们在 finally 块中放置一些清理资源的代码,例如关闭文件、释放内存等。

public class Example {
    public static void main(String[] args) {
        try {
            // 尝试将整数除以零
            System.out.println(3 / 0);
        } catch (ArithmeticException e) {
            // 捕获并处理算术异常
            System.out.println("算术异常!");
        } finally {
            // 无论是否发生异常,都会执行这里的代码
            System.out.println("清理资源...");
        }
    }
}

Try-catch-finally,执行顺序

包含return语句时,try-catch-finally的执行顺序 

总结

Finally块仅用于释放资源,禁止参与业务逻辑的处理,块内禁止使用return语句

3.3.4try-with-resources语句

 try-with-resources语句是Java 7中引入的一种try语句,旨在减轻开发人员释放try块中使用的资源的义务。它的全部想法是,开发人员无需担心仅在一个try-catch-finally块中使用的资源的资源管理。这是通过消除对finally块的需要而实现的,实际上,开发人员仅在关闭资源时才使用块。此外,使用try-with-resources的代码通常更清晰易读,因此使代码更易于管理,尤其是当我们处理许多try块时

static String readFirstLineFromFile(String path) throws IOException {
    // try-with-resources语句,声明了两个资源:FileReader和BufferedReader
    try (FileReader fr = new FileReader(path);
         BufferedReader br = new BufferedReader(fr)) {
        // 从文件中读取第一行
        return br.readLine();
    }
    // 在try块结束后,资源会被自动关闭
}

在这个例子中,声明在try-with-resources语句中的资源是一个FileReader和一个BufferedReader。这些资源的声明语句出现在紧跟在try关键字后面的括号内。在Java SE 7及更高版本中,类FileReaderBufferedReader实现了接口java.lang.AutoCloseable。由于在一个带有资源的try语句中声明了FileReader和BufferedReader实例,因此无论try语句是正常完成还是突然完成(由于方法BufferedReader.readLine抛出IOException),它们都将被关闭。

3.3.5 throw和throws 关键字

当方法没有捕获到可能发生的受检异常时,方法必须指定抛出受检异常 通过在方法声明添加throws子句,实现在方法抛出异常;在方法参数列表后(),方法体前{};方法抛出的所有异常使用“,”逗号分隔;

throwthrows是两个不同的关键字,它们都与异常处理有关。

throws关键字用于方法声明,用来指定该方法可能抛出的异常类型。它表示出现异常的一种可能性,但并不一定会发生这些异常。例如:

public void myMethod() throws IOException {
    // 方法体
}

throw关键字用于方法体内,用来显式地抛出一个异常对象。执行throw则一定抛出了某种异常对象。例如:

public void myMethod() {
    // ...
    throw new IOException("发生了IO异常");
}

Java throws 和throw关键字

import java.io.IOException;

public class ThrowsExample {
    public static void main(String[] args) {
        try {
            myMethod();
        } catch (IOException e) {
            // 处理异常
            System.out.println("捕获到了异常: " + e.getMessage());
        }
    }

    public static void myMethod() throws IOException {
        // 方法体
        // 如果在方法体中发生了IO异常,可以抛出
        throw new IOException("发生了IO异常");
    }
}

简单来说,throws关键字用于声明一个方法可能抛出的所有异常信息,而throw则是指抛出的一个具体的异常类型。

注意

3.3.6自定义异常

 在Java中,除了可以使用系统提供的异常类之外,还可以自定义异常类。自定义异常类通常用来表示程序中特定的异常情况。

public class CustomExceptionExample {
    public static void main(String[] args) {
        int score = -5;
        try {
            if (score < 0 || score > 100) {
                throw new InvalidScoreException("分数值无效: " + score);
            }
            System.out.println("分数值有效: " + score);
        } catch (InvalidScoreException e) {
            // 处理异常
            System.out.println(e.getMessage());
        }
    }
}

class InvalidScoreException extends Exception {
    public InvalidScoreException(String message) {
        super(message);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐系统概述

1.推荐系统的意义 随着移动互联网的飞速发展&#xff0c;人们已经处于一个信息过载的时代。在这个时代中&#xff0c;信息的生产者很难将信息呈现在对它们感兴趣的信息消费者面前&#xff0c;而对于信息消费者也很难从海量的信息中找到自己感兴趣的信息。推荐系统就是一个将信息…

git使用常见问题(提交代码,合并冲突)

文章目录Git提交代码步骤git pullgit statusgit addgit commitgit pushgit代码冲突合并问题方法一&#xff1a;放弃本地代码方法二&#xff1a;合并代码常用命令以及参数git add 将文件添加到仓库&#xff1a;git diff 比较文件异同git log 查看历史记录git reset 代码回滚版本…

Matlab-神经网络43个案例

神经网络简介 人工神经网络是在现代神经科学的基础上提出和发展起来的&#xff0c;旨在反映人脑结构及 功能的一种抽象数学模型。自 1943 年美国心理学家 W. McCulloch 和数学家 W. Pitts 提 出形式神经元的抽象数学模型—MP 模型以来&#xff0c;人工神经网络理论技术经过了 …

Java企业级开发学习笔记(2.1)MyBatis实现简单查询

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/zi0wB】 文章目录零、创建数据库与表一、基于配置文件方式使用MyBatis基本使用1.1 创建Maven项目 - MyBatisDemo1.2 在pom文件里添加相应的依赖1.3 创建与用户表对应的用户实体类 - User1.4 创建用…

数据库系统工程师——第四章 操作系统基础

文章目录&#x1f4c2; 第四章、操作系统基础 &#x1f4c1; 4.1 操作系统概述 &#x1f4d6; 4.1.1 基本概念 &#x1f4d6; 4.1.2 操作系统分类 &#x1f4d6; 4.1.3 操作系统的发展 &#x1f4c1; 4.2 进程管理 &#x1f4d6; 4.2.1 基本概念 &#x1f4d6; 4.2.2 进程的控…

电动滑板车出口欧洲CE认证EN17128标准

电动滑板车物美价廉、十分节省能源&#xff0c;充6小时电能骑20多公里&#xff0c;时速最高可达32迈&#xff0c;这对于任何年龄阶段(>12岁)的朋友来说绝对是非常适合的一种选择&#xff1b;与电动自行车相比&#xff0c;它造型美观、操作方便&#xff0c;而且因为座位重心低…

MaxHub智能电视使用123

开机和关机电视正下方&#xff0c;中央有一个圆形按钮。开机时&#xff0c;轻按此按钮1下&#xff0c;智能电视开始启动。启动后会显示MAXHUB。 如果使用中想让智能电视进入休眠状态&#xff0c;轻按此按钮1下即可。此时按钮变为红色。唤醒时&#xff0c;轻按此按钮1下&#x…

智慧物流仓储人员定位系统解决方案,提升物流仓储安全管理效率

随着近年我国制造业的崛起&#xff0c;物流业也得到了迅猛的发展&#xff0c;仓储越来越得到人们的重视。然而&#xff0c;传统仓储业存在着效率低、利用率不高、作业条件差等问题&#xff0c;以及部分仓储企业的业务模式较为基础和单一&#xff0c;导致仓储行业整体盈利水平较…

加密市场喜忧参半 DeFi与CeFi、监管之间有矛盾吗?

目前&#xff0c;身处其中的加密从业者大多喜忧参半。一方面&#xff0c;美国监管机构对中心化交易所的持续打压冲击着市场信心&#xff1b;另一方面&#xff0c;以BTC、ETH为代表的加密资产在二级市场表现相当不俗。 除价格因素外&#xff0c;加密领域内的多个信号正在显现出强…

详细介绍性能测试的方法(含文档)

性能测试是软件测试中的一个重要环节&#xff0c;其目的是评估系统在不同负荷下的性能表现&#xff0c;包括响应时间、吞吐量、并发数等指标。通常可以通过以下几种方法进行性能测试&#xff1a; 1、负载测试 负载测试是模拟多用户同时访问系统&#xff0c;测试系统在高并发、…

SaaS电子病历系统源码

SaaS电子病历系统&#xff1a;现代医疗的新趋势 SaaS电子病历系统是一种基于云计算技术的电子病历服务平台&#xff0c;它将传统的病历记录存储在云端&#xff0c;使用者可以通过互联网随时随地访问和查询病历信息。 相比于传统的医疗信息系统&#xff0c;SaaS电子病历系统具…

每日学术速递4.15

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Zip-NeRF: Anti-Aliased Grid-Based Neural Radiance Fields 标题&#xff1a;Zip-NeRF&#xff1a;基于网格的抗锯齿神经辐射场 作者&#xff1a;Xueyan Zou, Jianwei Yang, Hao …

在 Ubuntu 使用SQL Server创建 Go 应用程序

在 Ubuntu 使用SQL Server创建 Go 应用程序一、设置环境1.1、安装 SQL Server1.2、安装 GoLang1.3、安装 ODBC 驱动程序和 SQL 命令行实用工具 SQL 服务器二、使用 SQL 服务器创建 Go 应用程序2.1、创建连接到 SQL Server 并执行查询的 Go 应用2.2、创建一个使用 GORM 连接到 S…

macOS 13.4Beta 2(22F5037d)发布

系统介绍 4 月 12 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.4 开发者预览版 Beta 2 更新&#xff08;内部版本号&#xff1a;22F5037d&#xff09;&#xff0c;本次更新距离上次发布隔了 14 天。 macOS Ventura 带来了台前调度、连续互通相机、FaceTime 通…

Python爬虫之Scrapy框架系列(19)——实战下载某度猫咪图片【媒体管道类】

目录&#xff1a;1.引入&#xff1a;1.1 不使用管道&#xff0c;直接存储本地&#xff1a;①创建scrapy项目及爬虫文件②编写爬虫文件&#xff1a;③效果&#xff1a;1.2 使用管道&#xff0c;进行本地存储&#xff1a;①编写爬虫文件&#xff1a;②在items.py文件中创建相应的…

前缀和算法【一维、二维】

算法推导 首先这种算法适合于求从 x 到 y 的和。 一维情况 一维代码十分简单&#xff0c;我们只需要每个都记录前面所有的和即可&#xff0c;注意细节 下标从1开始 for(int i 1 ; i < n ; i ){cin >> temp;a[i] a[i - 1] temp; }这里我们就看两种情况&#xff…

接口优化的常见方案实战总结

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 &#xfeff; &#xfeff; &#xfeff;&#xfeff; 二、接口优化…

Maven下载与配置

Maven官网链接&#xff1a; https://maven.apache.org/ 进入后首页展示最新的下载地址 如果要下载历史版本&#xff0c;可以搜索 legacy archives 来快速找到这个地方&#xff0c;点击进入 下载完毕后&#xff0c;解压放到D盘&#xff08;或根据个人喜好存放&#xff09; 首先…

4月22日丨【云数据库技术沙龙】技术进化,让数据更智能

4月22日&#xff0c;云数据库技术沙龙“MySQL x ClickHouse”专场 “MySQL x ClickHouse” 技术沙龙&#xff0c;本次沙龙以“技术进化&#xff0c;让数据更智能”为主题&#xff0c;汇聚字节跳动、阿里云、玖章算术、华为云、腾讯云、百度等众多数据库厂商的技术大咖&#xf…

2023/4/10-2023/4/18周报

1 高德地图 运行抱错 INVALID_USER_SCODE 这里是错误信息对应原因 错误信息列表-参考手册-地图 JS API | 高德地图API 这里是高德地图api设置说明 准备-入门-教程-地图 JS API | 高德地图API 如果你自己能排查出错误 那不用看我的&#xff0c;如果都写的对还是抱错…