Java学习笔记(十)——异常

一、异常的概念

二、异常体系图(重要)

三、常见的异常

(一)常见的运行时异常

1、NullPointerException空指针异常

2、ArithmeticException数学运算异常

3、ArrayIndexOutOfBoundsException数组下标越界异常

4、ClassCastException类型转换异常

5、NumberFormatException数字格式不正确异常

(二)常见的编译时异常

四、异常处理概念

五、异常处理分类

(一)try-catch异常处理

(二)throws异常处理

六、自定义异常

七、throw和throws的对比

一、异常的概念

运行时异常

try-catch快捷键:选中可能出错的语句,再ctrl+alt+t

public class Exception01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        // 10 / 0  程序出现(抛出)异常 ArithmeticException
        // 当抛出异常后,程序退出(崩溃),下面的代码不再执行
        // 不应该出现了一个不算致命的问题,就导致整个系统崩溃
        // 提供了一个 异常处理机制 来解决问题
        // 如果进行异常处理,即使出现了异常,程序可以继续执行
        try {
            int res = num1 / num2;
        } catch (Exception e) {
//            e.printStackTrace();
            System.out.println("出现异常的原因:" + e.getMessage());
        }
        System.out.println("程序继续运行...");
    }
}

基本概念:Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)

执行过程中所发生的异常事件可分为两类:

1、Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError(栈溢出)和OOM(out of memory)。Error是严重错误,程序会崩溃。

2、Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等。Exception分为两大类:运行时异常和编译时异常(发生的时间不一样)。

二、异常体系图(重要)

1、异常分为两大类:运行时异常和编译时异常

2、运行时异常:编译器不要求强制处置的异常(编译器检测不出来),一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。

3、编译时异常:是编译器要求必须处置的异常

三、常见的异常

(一)常见的运行时异常

1、NullPointerException空指针异常

当应用程序试图在需要对象的地方使用null时,抛出该异常

2、ArithmeticException数学运算异常

当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时。

3、ArrayIndexOutOfBoundsException数组下标越界异常

用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

4、ClassCastException类型转换异常

当试图将对象强制转换为不是实例的子类时,抛出该异常。

5、NumberFormatException数字格式不正确异常

当应用程序试图将字符串转成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。(使用异常可以确保输入是满足条件数字)

(二)常见的编译时异常

1、SQLException:操作数据库时,查询表可能发生异常

2、IOException:操作文件时发生的异常

3、FileNotFoundException:当操作一个不存在的文件时发生的异常

4、ClassNotFoundException:加载类,而该类不存在时发生的异常

5、EOFException:操作文件,到文件末尾发生的异常

6、IllegalArguementException:参数异常

四、异常处理概念

基本介绍:异常处理就是当异常发生时,对异常处理的方式

异常处理的方式:

1、try-catch-finally:程序员在代码中捕获发生的异常,自行处理

2、throws:将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM

(1)try-catch-finally和throws二选一

(2)如果程序员没有显示处理异常,默认throws

五、异常处理分类

(一)try-catch异常处理

1、Java提供try和catch块来处理异常。try用于包含可能出错的代码,catch块用于处理try块中发生的异常。可以根据需要在程序中有多个数量的try...catch块

2、基本语法:

try{

        // 可疑代码

        // 将异常生成对应的异常对象,传递给catch块

}catch(异常){

        // 对异常的处理

}

如果没有finally,语法是可以通过的

3、注意事项:

(1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块

(2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch

(3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等),则使用finally

(4)可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前(比如Exception在后,NullPointerException在前),如果发生异常,只会匹配一个catch

(5)可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉、退出。应用场景:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。

(二)throws异常处理

 1、如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

2、在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类

public class Throws01 {
    public static void main(String[] args) {

    }
    // throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
    // public void f2() throws Exception
    // throws后面也可以是异常列表,即抛出多个异常
    // public void f2() throws FileNotFoundException, NullPointerException
    public void f2() throws FileNotFoundException {
        // 创建了一个文件流对象
        // 使用throws抛出异常,让调用f2()方法的调用者(方法)处理
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }
}

注意事项和使用细节:

1、对于编译异常,程序中必须处理,比如try-catch或者throws

2、对于运行时异常,程序中如果没有处理,默认就是throws的方式处理

3、子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型

4、在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws

5、注意抛出编译异常和运行时异常的区别

在f1()中要使用try-catch或者throws处理

六、自定义异常

当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

步骤:

1、定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException

2、如果继承Exception,属于编译异常

3、如果继承RuntimeException,属于运行时异常(一般来说继承RuntimeException,好处是可以使用默认的处理机制)

public class CustomException {
    public static void main(String[] args) {
        // 接收Person对象年龄时,要求范围在18-120之间,否则抛出一个自定义异常
        int age = 17;
        if(!(age >= 18 && age <=120)) {
            // 这里可以通过构造器设置信息
            throw new AgeException("年龄需要在18-120之间");
        }
        System.out.println("你的年龄范围正确");
    }
}
// 自定义异常
class AgeException extends RuntimeException {
    // 构造器
    public AgeException(String message) {
        super(message);
    }
}

七、throw和throws的对比

意义位置后面跟的东西
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象

 

public class Homework01 {
    public static void main(String[] args) {
        if(args.length != 2) {
            throw new ArrayIndexOutOfBoundsException("参数个数不对");
        }
        try {
            int n1 = Integer.parseInt(args[0]);
            int n2 = Integer.parseInt(args[1]);
            double res = cal(n1, n2);
            System.out.println("计算结果是" + res);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e.getMessage());
        } catch (NumberFormatException e) {
            System.out.println("参数格式不正确,需要输入整数");
        } catch (ArithmeticException e) {
            System.out.println("出现了除0的异常");
        }
    }
    public static double cal(int n1, int n2) {
        return n1 / n2;
    }
}

 

 

 

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

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

相关文章

阿里巴巴微服务治理框架的终极PK!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

Java调用shell脚本实现数据库备份功能

本篇文章主要介绍怎样使用Java程序&#xff0c;执行服务器上的数据库备份Shell脚本进行MySQL数据库的备份功能。 学习目标 使用Java执行Shell脚本、实现MySQL数据库的备份功能。 学习内容 编写导出MysSQL数据库的Shell脚本 以下是一个使用Bash脚本进行数据库备份的示例代码…

java基础之Java8新特性-Stream(流)

简介 流&#xff08;Stream&#xff09;是 Java 8 引入的一种处理集合数据的抽象概念&#xff0c;它提供了一种更简洁、更灵活的方式来操作和处理集合数据。流可以看作是一系列元素的管道&#xff0c;可以对这些元素进行筛选、转换、排序、归约等操作&#xff0c;实现各种数据…

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 输入&#xff1a;l1 []…

FC SAN光纤交换机维护介绍

一、什么是FC SAN &#xff1f; ​存储区域网络&#xff08;Storage Area Network&#xff0c;SAN&#xff09;采用网状通道&#xff08;Fibre Channel &#xff0c;简称FC&#xff0c;区别与Fiber Channel光纤通道&#xff09;技术&#xff0c;通过FC交换机连接存储阵列和服务…

实现目标检测中的数据格式自由(labelme json、voc、coco、yolo格式的相互转换)

在进行目标检测任务中&#xff0c;存在labelme json、voc、coco、yolo等格式。labelme json是由anylabeling、labelme等软件生成的标注格式、voc是通用目标检测框&#xff08;mmdetection、paddledetection&#xff09;所支持的格式&#xff0c;coco是通用目标检测框&#xff0…

学习笔记:C++之 switch语句

Switch语句 作用&#xff1a;执行多条件分支语句 语法&#xff1a; switch&#xff08;表达式&#xff09;{ case 结果1&#xff1a;执行语句&#xff1b;break&#xff1b; case 结果2&#xff1a;执行语句&#xff1b;break&#xff1b; ... default&#xff1a;执行语句&a…

Java反射之获取构造方法,成员变量,成员方法以及反射的作用

目录 1.什么是反射2.获取Class对象的三种方式3.反射获取构造方法4.反射获取成员变量5.反射获取成员方法6.反射的作用 1.什么是反射 在Java中&#xff0c;反射是指程序在运行时动态地获取类的信息、调用方法和访问属性的能力。 通过反射&#xff0c;可以在运行时获取类的构造函数…

什么是多因素身份验证(MFA)

多重身份验证&#xff08;MFA&#xff09;是在授予用户访问特定资源的权限之前&#xff0c;使用多重身份验证来验证用户身份的过程&#xff0c;仅使用单一因素&#xff08;传统上是用户名和密码&#xff09;来保护资源&#xff0c;使它们容易受到破坏&#xff0c;添加其他身份验…

计算机原理 (2) CPU的诞生 输入 输出 PC指针

文章目录 计算机的前世今生计算机的三个根本性基础1. 计算机是执行输入、运算、输出的机器&#xff1b;2.程序是指令和数据的集合&#xff1b;3.计算机的处理方式有时与人们的思维习惯不同 二、结论三、参考资料交个朋友 计算机的前世今生 上一篇文章最终结束的时候谈到希望给…

JavaScript异常处理实战

前言 之前在对公司的前端代码脚本错误进行排查&#xff0c;试图降低 JS Error 的错误量&#xff0c;结合自己之前的经验对这方面内容进行了实践并总结&#xff0c;下面就此谈谈我对前端代码异常监控的一些见解。 本文大致围绕下面几点展开讨论&#xff1a; JS 处理异常的方式…

鸿蒙开发基础运用(ArkTS)-健康生活APP

健康生活应用&#xff0c;主要功能包括&#xff1a; 用户可以创建最多6个健康生活任务&#xff08;早起&#xff0c;喝水&#xff0c;吃苹果&#xff0c;每日微笑&#xff0c;刷牙&#xff0c;早睡&#xff09;&#xff0c;并设置任务目标、是否开启提醒、提醒时间、每周任务频…

即时战略游戏的AI策略思考

想起来第一次玩RTS游戏&#xff0c;就是框住一大群兵进攻&#xff0c;看他们把对面消灭干净……我接触的第一款游戏是《傲世三国》那会儿是小学&#xff0c;后来高中接触了魔兽地图编辑器&#xff0c;我发现自己喜欢直接看属性而省去争论和试验的步骤——我喜欢能一眼看透的感觉…

Stable Diffusion 系列教程 - 6 Dreambooth及训练

Stable-Diffusion、Imagen等文生图大模型已经具备了强大的生成能力&#xff0c;假设我们的Prompt为 [Cyberpunk Style]&#xff0c;SD或许能很快画出赛博朋克风格的一幅画。但你作为一个不知名的人&#xff0c;不能奢求SD在训练的时候把你自己想要的风格也加进去吧&#xff1f;…

李沐-《动手学深度学习-02-目标检测

一 、目标检测算法 1. R-CNN a . 算法步骤 使用启发式搜索算法来选择锚框&#xff08;选出多个锚框大小可能不一&#xff0c;需要使用Rol pooling&#xff09;使用预训练好的模型&#xff08;去掉分类层&#xff09;对每个锚框进行特征抽取&#xff08;如VGG,AlexNet…)训练…

C语言中关于函数调用的理解

理论 关于函数调用的方式有两类&#xff1a;传值调用和传址调用 传值调用&#xff1a;函数的形参和实参分别占有不同的内存块&#xff0c;对形参的修改不会影响实参。 传址调用&#xff1a;把函数外部创建变量的内存地址传递给函数参数的一种调用方式。可以让函数和函数外面…

【ThreeJS入门——】WEB 3D可视化技术——threejs

简介 网页上已经可以做出很多复杂的动画&#xff0c;精美的效果。下图就是通过WebGL在网页中绘制高性能的3D图形。 threejs是一个让用户通过javascript入手进入搭建webgl项目的类库。 1、搭建第一个场景和物体 三维的物体要渲染在二维的屏幕上。首先要创建一个场景来放置物体…

源码编译部署篇(二)源码编译milvus成功后如何启动standalone并调试成功!

Milvus启动和调试 0 前言1 Milvus启动【问题描述】出现Aborted问题【问题分析】【解决方法】安装Pulsar服务执行单机启动命令解决监听端口号 2 Milvus调试编写launch.json验证单例调试成功 3 遇到的问题汇总问题1问题2:Permission denied 0 前言 由于Milvus官方文档只提及如何…

【LeetCode:228. 汇总区间 | 区间】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

FreeRTOS学习第6篇–任务状态挂起恢复删除等操作

目录 FreeRTOS学习第6篇--任务状态挂起恢复删除等操作任务的状态设计实验IRReceiver_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第6篇–任务状态挂起恢复删除等操作 本文目标&#xff1a;学习与使用FreeRTOS中的几项操作&#xff0c;有挂起恢复删除等操作…
最新文章