Java基础:异常(三)

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

待续未完
🙊🙊🙊

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

赞

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决Springboot服务启动报错:“Reason: Failed to determine suitable jdbc url”

1、错误详情 *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine sui…

【Qt秘籍】[004]-Qt中的重要工具-介绍

QtCreator概览 当我们打开系统的菜单翻到刚刚下载的Qt文件&#xff0c;里面的内容却让我们眼花缭乱。 不过别急&#xff0c;下面我们将一一解析。 1.Assistant Qt自带的离线版本官方文档 2.Designer Qt图形化设计界面的工具&#xff0c;通过拖拽控件快速生成界面&#xff0c…

当消费遇上AI:大模型如何成为行业“网红”?

在一个繁忙过后的周五晚上&#xff0c;美食发烧友Melissa和朋友痛快的享受了一顿海底捞火锅&#xff0c;餐毕&#xff0c;她像往常一样留下了服务评价&#xff0c;及时反馈是一位美食家的基本素养。 每天如同Melissa一样留下评价的客人不在少数&#xff0c;他们的真实体验反馈…

期权具体怎么交易详细的操作流程?

期权就是股票&#xff0c;唯一区别标的物上证指数&#xff0c;会看大盘吧&#xff0c;交易两个方向认购做多&#xff0c;认沽做空&#xff0c;双向t0交易&#xff0c;期权具体交易流程可以理解选择方向多和空&#xff0c;选开仓的合约&#xff0c;买入开仓和平仓没了&#xff0…

【小呆的力学笔记】连续介质力学的知识点回顾二:应变度量

文章目录 3. 格林应变与阿尔曼西应变 3. 格林应变与阿尔曼西应变 变形体在变形前的线元 O A → \overrightarrow{OA} OA &#xff0c;在变形后变成 o a → \overrightarrow{oa} oa &#xff0c;那么应变应该度量这种线元变形前后的差别。 ∣ o a → ∣ 2 − ∣ O A → ∣ 2 …

计算机体系结构-2024期末考试

前言 最后一个字落笔&#xff0c;虽然知道并没有发挥到最好&#xff0c;内心还是感慨良多。 真正意义上本科阶段的课程考试&#xff0c;到此就结束了。 正如青春总有不完美的地方&#xff0c;此刻思绪竟飘到了三年前的盛夏&#xff0c;那个骄傲的少年。 扯远了&#xff0c;…

物联网应用系统与网关

一. 传感器底板相关设计 1. 传感器设计 立创EDA传感器设计举例。 2. 传感器实物图 3. 传感器测试举例 测试激光测距传感器 二. 网关相关设计 1. LORA&#xff0c;NBIOT等设计 2. LORA&#xff0c;NBIOT等实物图 3. ZigBee测试 ZigBee测试 4. NBIoT测试 NBIoT自制模块的测试…

kafka-主题创建(主题操作的命令)

文章目录 1、topic主题操作的命令1.1、创建一个3分区1副本的主题1.1.1、获取 kafka-topics.sh 的帮助信息1.1.2、副本因子设置不能超过集群中broker的数量1.1.3、创建一个3分区1副本的主题1.1.4、查看所有主题1.1.5、查看主题详细描述 1、topic主题操作的命令 kafka发送消息会存…

mysql连接池的实现

概要&#xff1a;本文介绍mysql连接池的实现&#xff0c;要求读者了解线程池 一、为什么需要mysql连接池&#xff1f; 资源复用 &#xff1a;不使用连接池&#xff0c;每次数据库请求都新建一条连接&#xff0c;将耗费系 统资源。 流程如下&#xff1a; 通过三次握手建立 TC…

海博思创储能系统产品再获认可,获得杰出项目类别入围资格

近日&#xff0c;2024年欧洲智慧能源展览会大奖&#xff08;The smarter E AWARD 2024&#xff09;公布了入围名单&#xff0c;该奖项设有五个类别&#xff1a;光伏、储能、电动出行、智能综合能源和杰出项目奖&#xff0c;旨在表彰能源领域中的卓越创新成果。 在入围项目中&a…

linux线程,线程控制与线程相关概念

线程概念 线程这个词或多或少大家都听过&#xff0c;今天我们正式的来谈一下线程&#xff1b; 在我一开始的概念中线程就是进程的一部分&#xff0c;一个进程中有很多个线程&#xff0c;这个想法基本是正确的&#xff0c;但细节部分呢我们需要细细讲解一下&#xff1b; 什么…

Web渗透-MySql-Sql注入:联合查询注入

SQL注入&#xff08;SQL Injection&#xff09;是一种网络攻击技术&#xff0c;攻击者通过将恶意的SQL代码插入到应用程序的输入字段&#xff0c;从而欺骗应用程序执行未经授权的操作。这种攻击方式可以导致严重的安全问题&#xff0c;包括&#xff1a; 数据泄露&#xff1a;攻…

HCIP-Datacom-ARST自选题库__BGP多选【22道题】

1.BGP认证可以防止非法路由器与BGP路由器建立邻居&#xff0c;BGP认证可以分为MD5认证和Keychain认证&#xff0c;请问以下哪些BGP报文会携带BCGP Keychain认证信息?(报头携带) open Update Notication Keepalive 2.传统的BGP-4只能管理IPv4单播路由信息&#xff0c;MP-B…

数据库(10)——图形化界面工具DataGrip

以后关于数据库的图片演示就使用DataGrip了 : ) 创建数据库和表 在连接上数据库之后&#xff0c;可以选择Schema创建一个新的数据库。 点击OK后&#xff0c;就已经创建了一个空的表。 要在数据库中建立一张新的表&#xff0c;右键数据库&#xff0c;点击new table 要给新表添…

【软考】下篇 第19章 大数据架构设计理论与实践

目录 大数据处理系统架构特征Lambda架构Lambda架构介绍Lambda架构实现Lambda架构优缺点Lambda架构与其他架构模式对比 Kappa架构Kappa架构介绍Kappa架构实现Kappa架构优缺点 常见Kappa架构变形&#xff08;Kappa、混合分析系统&#xff09;Kappa架构混合分析系统的Kappa架构 La…

数组长度属性的安排与深度学习中的数据类型探索

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、数组长度属性的理解与应用 1. 数组形状信息的获取 2. 数组形状的变换 3. 数组类型的指…

关于本人VIP付费文章说明

郑重声明&#xff1a;我写博客只是为了记录分享经验 自从上次写完数据结构系列后我就一直没有登陆&#xff0c;目前也没打算继续开新内容。今天偶然发现我之前写的文章被设为vip文章&#xff0c;要vip解锁才能看&#xff0c;我很确定当初我发布的时候选择的是公开&#xff0c;…

SpirngMVC框架学习笔记(一):SpringMVC基本介绍

1 SpringMVC 特点&概述 SpringMVC 从易用性&#xff0c;效率上 比曾经流行的 Struts2 更好 SpringMVC 是 WEB 层框架&#xff0c;接管了 Web 层组件, 比如控制器, 视图, 视图解析, 返回给用户的数据格式, 同时支持 MVC 的开发模式/开发架构SpringMVC 通过注解&#xff0c;…

【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路

目录 一、污点(Taint) 1.1污点介绍 1.2污点的组成格式 1.3当前 taint effect 支持如下三个选项&#xff1a; 1.4污点的增删改查 1.4.1验证污点的作用——NoExecute 1.4.2验证污点的作用——NoSchedule 1.4.3 验证污点的作用——PreferNoSchedule 1.5污点的配置与管理…

单链表的相关题目

1.删除链表中给定值val的所有结点 public void removeall(int key) {//由于是删除链表中所有和key值相同的结点,所以可以设置两个ListNode类型的数据,一个在前面,一个在后面.//直到前面的走到链表的最后,这样完成了遍历.//先判断一下这个链表是否为空if(headnull){System.out.…