Java异常讲解

news2025/1/23 2:16:45

🐵本篇文章将对异常相关知识进行讲解


一、异常的结构

在程序执行的过程中出现的一些问题叫做异常,异常其实是一个一个类,每一种异常都代表一个类

1.1 几种常见的异常

System.out.println(10/0); //算数异常
//Exception in thread "main" java.lang.ArithmeticException: / by zero

int[] arr = new int[]{1,2,3,4};
System.out.println(arr[10]); //数组越界异常
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10

int[] arr = null;
System.out.println(arr[10]); //空指针异常
//Exception in thread "main" java.lang.NullPointerException

1.2 异常的结构

图中的Exception就是我们说的异常,它继承自Throwable类,同时又派生出IOException和RunTimeException类,它们分别是编译时异常(受查异常)和运行时异常(非受查异常)

二、异常的处理

关于异常的处理有5个关键字:throw,throws,try,catch,finally;下面会逐个讲解

2.1 异常的抛出:throw

int[] arr = new int[]{1,2,3,4};
System.out.println(arr[10]); //数组越界异常

在下面的代码中会抛出一个数组越界异常,如下:

这时编译器自己抛出的,在一些特定的环境下,我们也可以自己主动抛异常,来让程序终止,这时就可以用到throw关键字,用法如下:

throw new ...Exception("数组越界异常");

将上面的代码改成下面的:

int pos = 6;
int[] arr = new int[]{1,2,3,4};
if (pos > arr.length) {
    throw new ArithmeticException("数组越界异常");
}
System.out.println("after");

运行结果如下:

可以看到最后一句打印after并没有执行

throw相关注意事项:

1.throw必须写到方法内部

2.throw只能抛出Exception的对象或Exception子类的对象

3.异常一经抛出,其后的代码将不再执行

2.2 异常的声明:throws

throws在方法的参数列表之后,用法如下:

public static void func() throws ArithmeticException {
    System.out.println(10/0);
}

其作用是告诉该方法的调用者此方法可能有这个异常,调用者必须处理该异常或继续将该异常告诉它的调用者,如果没有进行上述操作,则:1. 若抛出的编译时异常,则编译报错,2. 若抛出的是运行时异常,则该异常会交给JVM处理,程序会直接终止


public static void func1() throws Exception{
        
}
public static void main(String[] args) throws Exception{
    func1();
}

上述代码中func1方法声明一个Exception,Exception类派生出IOException和RuntimeException两个类,main方法会将这里当成一个编译时异常处理,那么要想不编译报错,应该在main方法也声明Exception

throws相关注意事项:

1. throws关键字必须在方法的参数列表之后

2. 只能声明Exception或Exception的子类

3. 如果要声明多个异常,则让异常之间用逗号隔开即可,若多个异常具有父子关系,则只声明父类异常即可

2.3 异常的捕获:try-catch

try-catch通常用来处理异常用的,使用方法如下图:

下面举个实例:

    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        try {
            System.out.println(arr[100]);

            System.out.println("after"); //由于上面那行代码抛出了异常,所以这行代码不会执行

        } catch (ArrayIndexOutOfBoundsException e) { //异常被这个catch捕获
            System.out.println("这是个数组下标越界异常");
            e.printStackTrace(); //打印红字

        } catch (NullPointerException e) {
            System.out.println("这是个空指针异常");
            e.printStackTrace();
        }
        System.out.println("after try catch");
    }

打印结果:

2.4 finally

finally一般放在try-catch结构的最后,

finally中的代码一定会被执行,所以通常在其中进行一些资源清理的扫尾工作

    public static int getData() {
        Scanner scanner = new Scanner(System.in);

        try {
            int data = scanner.nextInt();
            return data; //data被返回后,finally中的代码仍然会执行
        } catch (InputMismatchException e) {
            e.printStackTrace();
            System.out.println("输入异常错误");
        } finally {
            System.out.println("执行finally中的代码");
            scanner.close();
        }
        System.out.println("try-catch-finally之后的代码"); //这里的代码不会被执行
        return 0;
    }

三、自定义异常

前面说过异常是一个类,自定义一个异常类必须继承Exception或RuntimeException,继承自Exception的异常默认为编译时异常,继承自RuntimeException的异常默认为运行时异常 

//自定义用户名错误异常
public class UserNameException extends RuntimeException{
    public UserNameException() {
        super();
    }
    public UserNameException(String s) {
        super(s);
    }
}

//自定义密码错误异常
public class PassWordException extends RuntimeException {
    public PassWordException() {
        super();
    }
    public PassWordException(String s) {
        super(s);
    }
}

   
class Test {
    private String admin = "admin";
    private String passWord = "123456";

    public void login(String admin, String passWord) {
        if (!this.admin.equals(admin)) {
            throw new UserNameException("用户名错误!");
        } else if (!this.passWord.equals(passWord)) {
            throw new PassWordException("密码错误!");
        }
    }
    public static void main(String[] args) {
        //int a = getData();
        Test test = new Test();
        test.login("admin1", "123456");
    }
}

下面是空指针异常的源码,我们上面自定义异常的内容是仿照此来写的

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

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

相关文章

QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

前文链接:QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』 前一篇文章提到的异步单瓦片加载,是指线程每准备好一个瓦片数据后,立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后,一起抛出信号让…

flink中处理kafka分区的消息顺序

背景 kafka分区的消息是有序的,那么flink在消费kafka分区的时候消息的顺序是怎么样的呢?还能保持这个有序性吗,本文就来记录下 flink消费kafka分区的顺序性 从上图可知,flink的转换算子比如map,flatMap,f…

D. In Love

贪心,维护最靠左的右端点以及最靠右的左端点 // Problem: D. In Love // Contest: Codeforces - Codeforces Round 905 (Div. 3) // URL: https://codeforces.com/contest/1883/problem/D // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Edi…

C语言--每日练习题--Day38

第一题 1. 下列代码的运行结果() short i 65537; int j i 1; printf("i%d,j%d\n", i, j); A:i 65537,j 65538 B:i 1,j 2 C:i -1,j 0 D:i 1&#xff…

多向通信----多人聊天

package 多人聊天; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; publ…

Xcode15 Library ‘iconv.2.4.0‘ not found

Xcode 15运行老代码报错:Library iconv.2.4.0 not found 解决: TARGETS-->Bulid Phases --> Link Binary With Libraries 添加一个“Libiconv.tbd”, 同时把原来的 “libiconv.2.4.0.tbd”删除(一定要删除,不然运行还是…

微服务开发:断路器详解

微服务是目前业界使用的最重要的实现方面。通过使用微服务架构,开发人员可以消除他们以前在单体应用程序中遇到的许多问题。展望未来,人们开始在微服务中搜索和采用各种模式。大多数时候,新模式的产生是为了解决另一个模式中出现的常见问题。…

ahk系列-windows超级运行框-表达式计算(11)—avg /sum 平均求和

1、环境准备 windows 7,8,10,11操作系统ahk 2.x_64位 2、使用方式 avg /sum 计算平均值,计算总和 支持数字中可以简写 k(千) , w(万) ,y(亿) 可以计算运行框中的数据,也可以计算剪切板中的数…

【Linux】进程控制-进程终止

目录 一、进程终止,OS做了什么? 二、进程终止的常见方式 1、代码跑完,结果正确 2、代码跑完,结果不正确 补充 (1)、main函数的返回值的意义是什么? (2)、return 0的含义是什么? (3)、退出码是什么和…

ps-把文字刻进石头上

使用到的工具 准备图片:一张石头的图片,一张有喜欢字体的空白图片 得到一个纹理的psd文件:只把文字的图片显示,CTRLshifts保存成psd文件 “滤镜”——“滤镜库”——“纹理化”——(选中文字图片的psd文件&#xff09…

代码随想录算法训练营第三十六天|01背包问题 二维 ,01背包问题 一维 ,416. 分割等和子集

背包理论基础 01 背包(二维) 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 背包最大重量为4。 物品为&#x…

Segment Anything--SAM自动标注(一)

文章目录 开场白基本组件搞事情从来不是一帆风顺复旦方案分支回归主线 开场白 老样子先说一下为什么我会看到这篇文章。答案是“自动标注”。 这个事情是这样,自动驾驶不光需要做目标检测任务也需要语义分割的信息给到后处理。当然现在做自动驾驶都在往BEV方案上靠…

IntelliJ IDEA 之初体验

文章目录 第一步:下载与安装 IntelliJ IDEA1)官网下载2)选择那种安装包3)开始下载4)解压 第二步:启动 IntelliJ IDEA第三步:创建第一个 Java 项目第四步:运行第一个 Java 程序1&…

【408】计算机学科专业基础 - 计算机组成原理

一、计算机系统概述 【复习提示】 本章是组成原理的概述,考查时易针对有关概念或性能指标出选择题,也可能综合后续章节的内容出有关性能分析的综合题。掌握本章的基本概念,是学好后续章节的基础。部分知识点在初学时理解不深刻也无须担忧&am…

智能优化算法应用:基于变色龙算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于变色龙算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于变色龙算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.变色龙算法4.实验参数设定5.算法结果6.参考文献7.…

十五、FreeRTOS之FreeRTOS信号量

本节需要掌握以下内容: 1,信号量的简介(了解) 2,二值信号量(熟悉) 3,二值信号量实验(掌握) 4,计数型信号量(熟悉) 5&…

Linux--程序地址空间

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 [TOC](文章目录) 一、程序地址空间回顾 我们在讲C语言的时候,老师给大家画过这样的空间布局…

Transformer在视觉的应用

文章目录 Vison TransformerSwin TransformerVisual Attention Network Vison Transformer transformer 在 cv 中最重要的算法 Linear Projection of Flattened Patches 对于标准的Transformer模块,要求输入的是token(向量)序列&#xff…

鸿蒙4.0开发笔记之ArkTS语法基础之应用生命周期与页面中组件的生命周期(十六)

文章目录 一、应用生命周期二、生命周期函数定义三、生命周期五函数练习 一、应用生命周期 1、定义 应用生命周期就是代表了一个HarmonyOS应用中所有页面从创建、开启到销毁等过程的全生命周期。查看路径如下: Project/entry/src/main/ets/entryability/EntryAbili…