Java基础:异常(三)

news2024/11/17 13:22:02

Java基础:异常(三)


文章目录

  • Java基础:异常(三)
    • 1. Java异常体系
      • 1.1 错误的分类
      • 1.2 异常的分类
    • 2. 异常的捕获与处理
      • 2.1 try-catch
      • 2.2 finally
    • 3. 异常的抛出
    • 4. 自定义异常


1. Java异常体系

Java的异常体系是Java中用于处理运行时错误和其他异常情况的重要机制。它基于一个层次结构,其中Throwable是所有错误和异常的基类。在Java中,主要有两种类型的可抛出对象:ErrorException。Java的异常体系,可以保证程序的健壮性。

java异常体系

1.1 错误的分类

Java中的程序错误分为三类:

  • 编译错误(Compilation Error):编译错误是在程序源代码被编译器处理(即编译)成可执行文件时发生的错误,这些错误通常是由于违反了编程语言的语法规则或编译器无法理解的代码结构造成的。
  • 运行错误(Runtime Error):运行错误是程序在运行时(即执行时)发生的错误,这些错误通常是由于程序试图执行无效的操作或访问不存在的资源造成的。在Java中,运行错误通常表现为异常(Exception)。异常是一种特殊的对象,用于表示程序运行时的错误情况。
  • 逻辑错误(Logical Error): 逻辑错误是程序在逻辑上不正确或不符合预期的错误,这些错误通常是由于程序员的编程逻辑错误或对问题的不正确理解造成的。逻辑错误不会导致程序崩溃或产生异常,但会导致程序产生不正确的结果或行为。

1.2 异常的分类

Java中的异常分为两类:

  • 检查型异常(Checked Exception):检查型异常在编译时会被检查,如果方法可能抛出检查型异常,但该方法没有使用throws关键字声明该异常,或者没有捕获该异常,那么编译器会报错。
检查型异常说明
IOException输入输出流异常
SQLExceptionSQL异常
FileNotFoundException文件找不到异常
ClassNotFoundException类找不到异常
InterruptedException线程中断异常
  • 非检查型异常(Unchecked Exception):未检查型异常是指RuntimeException(运行时异常)类及其子类异常,在编译时不会被检查,它们通常是由程序逻辑错误引起的。
运行时异常说明
RuntimeException运行时异常父类
ArithmeticException算术异常,如除零操作
ArrayIndexOutOfBoundsException数组下标越界异常
NullPointerException访问null对象引用
NumberFormatException数字格式异常
java.lang.ClassCastException类型转换异常

2. 异常的捕获与处理

2.1 try-catch

在一个try块中,可能会产生多个异常,在后面可以接多个catch,去捕捉不同的异常。如果try块中,出现异常,直接进入对应的catch块中,try块中出现异常后的代码不会继续执行。语法格式如下:

try {  
    // 尝试执行可能会抛出异常的代码  
    // ...  
} catch (ExceptionType1 e) {  
    // 处理ExceptionType1类型的异常  
    // ...  
} catch (ExceptionType2 e) {  
    // 处理ExceptionType2类型的异常  
    // ...  
} 
// 可以有多个catch块来处理不同类型的异常

从JDK7版本之后,可以在一个catch块中,捕捉多个异常。代码示例如下:

package com.coder.exception;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入两个数:");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        int m[] = new int[10];
        try {
            int z = x / y; // y=0
            System.out.println(z);
            m[10] = 10; // 数组下标越界
            System.out.println(m[10]);
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { // >=JDK7版本
            // 获取错误消息
            System.out.println("出现错误:" + e.toString());
        }
    }
}

🆚🆚运行结果:

请输入两个数:
10 2
5
出现错误:java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10

请输入两个数:
10 0
出现错误:java.lang.ArithmeticException: / by zero

如果trycatch操作出现嵌套情况,内部的catch如果不能处理内部try代码块的异常,则由外部的catch块进行捕捉。代码示例如下:

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入两个数:");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        int m[] = new int[10];
        try {
            int z = x / y; // y=0
            System.out.println(z);
            try {
                m[10] = 20; // 数组下标越界
                System.out.println(m[10]);
                //String str = null;
                //System.out.println(str.toLowerCase());
            } catch (NullPointerException e) { // 非检查型异常 空指针异常
                System.out.println("数组下标越界");
            }
        } catch (ArithmeticException e) {
            // 打印异常堆栈轨迹
            e.printStackTrace();
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("外面的catch块处理数组下标越界");
        }
    }
}

🆚🆚运行结果:

请输入两个数:
10 2
5
外面的catch块处理数组下标越界

请输入两个数:
10 0
java.lang.ArithmeticException: / by zero
	at com.coder.exception.Test.main(Test.java:18)

📌:异常消息的处理包括:

  1. e.getMessage(),获取异常信息;
  2. e.toString(),获取异常类和信息;
  3. e.printStackTrace(),打印异常堆栈轨迹。

2.2 finally

以下是finally的执行流程:
finally
其语法格式如下:

try {
    // 尝试执行可能会抛出异常的代码
} catch (具体的异常类 e) {
} finally {
    //释放资源
}
  • 使用finally完成资源释放。例如:关闭打开的连接,删除临时文件,关闭打开文件。
  • finally不管是否出现异常,都会被执行到。如果trycatch块中,有return语句,finallyreturn
    码之前执行。
  • 如果trycatch代码块中,执行了System.exit(0)退出虚拟机操作,finally代码块中的语句不再执行。

代码示例如下:

public class Test2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入两个数:");
        int x = scanner.nextInt();
        int y = scanner.nextInt();
        int m = test(x, y);
        System.out.println(m);
    }

    public static int test(int x, int y) {
        System.out.println("进入test方法");
        int z = 0;
        try {
            z = x / y; // y=0
            System.out.println("除法执行完成");
            System.exit(0);  // 退出虚拟机操作
            return z;
        } catch (ArithmeticException e) {
            return 0;
        } finally {
            System.out.println("关闭连接");
            return -1;
        }
    }
}

🆚🆚运行结果:

请输入两个数:
10 2
进入test方法
除法执行完成

10 0
进入test方法
关闭连接
-1

📌trycatchfinally不能单独使用:

  1. trycatch使用;
  2. trycatchfinally使用;
  3. tryfinally使用。

3. 异常的抛出

  • throws用法:用于声明一个方法可能会抛出的异常列表,但它并不处理这些异常。谁来调用这个方法,谁处理这些异常。throws后面可以接多个异常类型,中间使用逗号分隔。
  • throw用法:使用throw抛出明确的异常处理,语法格式:throw new ExceptionType(parameters);throw在方法体内的语句,如果抛出的是运行时异常,可以不需要做任何处理。如果抛出的是检查型异常,不能单独使用,必须要配合try-catch或者throws使用。

代码示例如下:

public class Test4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入姓名和年龄:");
        String name = scanner.next();
        int age = scanner.nextInt();
        System.out.println("姓名:" + name + "," + "年龄:" + age);
        Person person = new Person(name, age);
        // 2. 使用try-catch块:处理检查型异常时,在调用方法的代码周围使用try-catch块来捕获并处理异常。
        try {
            checkPersonInfo(person);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 1. 在方法签名中使用throws关键字:如果你不想在当前方法中处理异常,你可以使用throws关键字将异常声明给方法的调用者。
    public static void checkPersonInfo(Person person) throws FileNotFoundException {
        if (person.getAge() < 18) {
            throw new NullPointerException("年龄必须在18岁以上"); // 使用throw抛出运行型异常
        }
        if (person.getName().length() < 2) {
            throw new FileNotFoundException("姓名必须是2位以上"); // 使用throw抛出检查型异常,必须要配合try-catch或者throws使用
        }
    }
}

🆚🆚运行结果:

请输入姓名和年龄:
张三 10
姓名:张三,年龄:10
Exception in thread "main" java.lang.NullPointerException: 年龄必须在18岁以上
	at com.coder.exception.Test4.checkPerName(Test4.java:30)
	at com.coder.exception.Test4.main(Test4.java:21)

请输入姓名和年龄:
张 18
姓名:张,年龄:18
java.io.FileNotFoundException: 姓名必须是2位以上
	at com.coder.exception.Test4.checkPerName(Test4.java:33)
	at com.coder.exception.Test4.main(Test4.java:21)

📌

  1. 运行时异常通常表示编程错误或不可恢复的错误情况,如数组越界、空指针引用等。因此,在编写代码时应该尽量避免抛出运行时异常,除非确实出现了无法恢复的错误。
  2. 与检查型异常不同,运行时异常在方法签名中不需要使用throws关键字来声明。这是因为运行时异常在编译时期不会被检查,所以编译器不会强制要求你处理这些异常。
  3. 虽然运行时异常在编译时期不需要被显式处理,但在实际编程中,最好还是捕获并处理这些异常,以确保程序的健壮性和可维护性。

4. 自定义异常

自定义异常是指在Java程序中根据特定业务需求创建的异常类,这些类继承自Exception类或其子类(如RuntimeException),以提供更详细的错误信息和更准确地表达特定的业务含义。代码示例如下:

public class AgeException extends Exception{
    public AgeException(){
        super("年龄不符合要求");
    }
    public AgeException(String message){
        super(message);
    }
}

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

以上内容是关于Java异常的基础知识,希望对初学者或再次学习者有所帮助,基础打扎实,不怕风吹雨打!如果以上内容有错误或者内容不全,望大家提出!我也会继续写好每一篇博文!
👍👍👍

待续未完
🙊🙊🙊

欢迎观看和提问!!!
👏👏👏

赞

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

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

相关文章

醒图及国际版 v9.9.9/v3.9.0 解锁会员(让照片栩栩如生的神奇应用)

介绍 醒图App是一款专业的照片编辑工具&#xff0c;旨在帮助用户高效地处理和优化照片&#xff0c;使其更加引人注目。这款应用程序配备了多样化的功能&#xff0c;包括图像增强、滤镜应用以及色彩调整等&#xff0c;以满足各种编辑需求。其设计了一个直观的用户界面&#xff…

C# yolov8 TensorRT +ByteTrack Demo

C# yolov8 TensorRT ByteTrack Demo 目录 效果 说明 项目 代码 Form2.cs YoloV8.cs ByteTracker.cs 下载 参考 效果 说明 环境 NVIDIA GeForce RTX 4060 Laptop GPU cuda12.1cudnn 8.8.1TensorRT-8.6.1.6 版本和我不一致的需要重新编译TensorRtExtern.dll&…

保姆教程系列:小白也能看懂的 Linux 挂载磁盘实操

&#xff01;&#xff01;&#xff01;是的没错&#xff0c;胖友们&#xff0c;保姆教程系列又更新了&#xff01;&#xff01;&#xff01; 文章目录 前言简介一、磁盘分区二、文件系统三、实际操作1. 使用lsblk命令查看新加入的磁盘信息2. 使用fdisk或者cfdisk分区新磁盘&am…

工业制造企业为什么要进行数字化转型

人人都在谈数字化转型&#xff0c;政府谈数字化策略方针&#xff0c;企业谈数字化转型方案&#xff0c;员工谈数字化提效工具。互联网企业在谈&#xff0c;工业企业也在谈。 在这种大趋势下&#xff0c;作为一个从事TOB行业十年的老兵&#xff0c;今天就来给大家讲讲&#xff…

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程 RLHF训练的三个步骤步骤1&#xff1a;收集数据与有监督训练策略步骤2&#xff1a;收集数据训练奖励模型步骤3&#xff1a;结合奖励模型利用强化学习算法如PPO算法来优化策略 参考内容 RLHF训练的三个…

236. 二叉树的最近公共祖先(C++)

文章目录 前言一、题目介绍二、解决方案三、优化总结 前言 在本篇文章中我们将会讲解二叉树中极为经典的题目236. 二叉树的最近公共祖先 一、题目介绍 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的…

BLE蓝牙模块在虚拟车钥匙上的运用—开启无钥匙驾驶新时代

随着科技的不断发展&#xff0c;人们对汽车的智能化需求也日益增长。在这个背景下&#xff0c;BLE蓝牙模块在虚拟车钥匙上的运用应运而生&#xff0c;为消费者带来更加便捷、智能的出行体验。本文将从以下几个方面阐述BLE蓝牙模块在虚拟车钥匙上的应用。   一、什么是BLE蓝牙…

精酿啤酒:品质与口感在啤酒行业竞争中的竞争优势

在啤酒行业中&#xff0c;竞争激烈&#xff0c;品牌众多。要想在竞争中脱颖而出&#xff0c;需要具备与众不同的竞争优势。对于Fendi club啤酒而言&#xff0c;其卓着的品质和与众不同的口感成为了其在竞争中取胜的关键。 品质是啤酒行业竞争中的核心要素。Fendi club啤酒在原料…

Redis中的数据结构与内部编码

本篇文章主要是对 Redis 常见的数据结构进行讲解&#xff0c;同时还对其所对应的不同的内部编码进行讲解。希望本篇文章会对你有所帮助。 文章目录 一、五大数据结构 二、数据结构对应的编码方式 String hash list set zset &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &…

node.js(express)+MongoDB快速搭建后端---新手教程

前言&#xff1a; Node.js是一个基于 Chrome V8引擎的JavaScript运行环境&#xff0c;是对于前端工程师来说学习成本最小的后端实现方法&#xff0c;本篇文章总结如何从0-1写一个后端的登录接口 一、检查node环境 先检查自己的node是否安装 一般来说前端工程师的电脑环境肯定…

长安链使用Golang编写智能合约教程(二)

本篇说的是长安链2.3.的版本的智能合约&#xff0c;虽然不知道两者有什么区别&#xff0c;但是编译器区分。 教程三会写一些&#xff0c;其他比较常用SDK方法的解释和使用方法 编写前的注意事项&#xff1a; 1、运行一条带有Doker_GoVM的链 2、建议直接用官方的在线IDE去写合…

【机器学习】Pandas中to_pickle()函数的介绍与机器学习中的应用

【机器学习】Pandas中to_pickle()函数的介绍和机器学习中的应用 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#…

【Android】【netd】网络相关调试技巧

网络调试技巧总结 ifconfig ifconfig 查看网卡信息 ifconfig -S tcpdump tcpdump -i any -n icmp 查看流量出入ip addr 上面的log 以及ifcong -S 信息可以知道&#xff0c;当前是从wlan0 网卡请求数据。 iptable iptable 部分指令 //禁止www.baidu.com 网址流量进入&a…

网易面试:手撕定时器

概述&#xff1a; 本文使用STL容器-set以及Linux提供的timerfd来实现定时器组件 所谓定时器就是管理大量定时任务&#xff0c;使其能按照超时时间有序地被执行 需求分析&#xff1a; 1.数据结构的选择&#xff1a;存储定时任务 2.驱动方式&#xff1a;如何选择一个任务并执…

在HTML和CSS当中运用显示隐藏

1.显示与隐藏 盒子显示:display:block;盒子隐藏: display:none:隐藏该元素并且该元素所占的空间也不存在了。 visibility:hidden:隐藏该元素但是该元素所占的内存空间还存在&#xff0c;即“隐身效果”。 2.圆角边框 在CSS2中添加圆角&#xff0c;我们不得不使用背景图像&am…

redis面试知识点

Redis知识点 Redis的RDB和AOF机制各是什么&#xff1f;它们有什么区别&#xff1f; 答&#xff1a;Redis提供了RDB和AOF两种数据持久化机制&#xff0c;适用于不同的场景。 RDB是通过在特定的时刻对内存中的完整的数据复制快照进行持久化的。 RDB工作原理&#xff1a; 当执行…

Python 机器学习 基础 之 无监督学习 【聚类(clustering)/k均值聚类/凝聚聚类/DBSCAN】的简单说明

Python 机器学习 基础 之 无监督学习 【聚类&#xff08;clustering&#xff09;/k均值聚类/凝聚聚类/DBSCAN】的简单说明 目录 Python 机器学习 基础 之 无监督学习 【聚类&#xff08;clustering&#xff09;/k均值聚类/凝聚聚类/DBSCAN】的简单说明 一、简单介绍 二、聚类…

Vue3兼容低版本浏览器(ie11,chrome63)

1、插件安装 为了使你的项目兼容 Chrome 63&#xff0c;你需要确保包含适当的 polyfills 和插件配置。你已经在使用 legacy 插件&#xff0c;但在代码中可能缺少一些配置或插件顺序有问题。以下是几个可能的改进&#xff1a; 安装 vitejs/plugin-legacy 插件&#xff1a; 确保…

Midjourney保姆级教程(五):Midjourney图生图

Midjourney生成图片的方式除了使用文字描述生成图片外&#xff0c;还有“图生图”的方式&#xff0c;可以让生成的图片更接近参考的图片。 今天我们来聊聊“图生图”的方式。 一、模仿获取propmt 很多时候&#xff0c;我们不知道画什么内容的图片&#xff0c;大家可以关注内…

一款拥有15000+POC漏洞扫描工具

1 工具介绍 0x01 免责声明 请勿使用本文中所提供的任何技术信息或代码工具进行非法测试和违法行为。若使用者利用本文中技术信息或代码工具对任何计算机系统造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责。本文所提供的技术信息或代码工具仅供于学习&am…