【java基础】异常处理机制

目录

1、异常体系介绍

1.1、异常是什么?

1.2、运行时异常和编译时异常的区别?

2、异常的用法

 2.1、捕获异常

2.2、异常中的常见方法

2.3、抛出异常

2.4、自定义异常


1、异常体系介绍

1.1、异常是什么?

        java异常是指在程序运行时可能出现的一些错误,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流。Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。

        简单来说,异常就是程序中可能出现的问题。

Java异常类层次结构图

Java所有异常类都是 Throwable的子类,两个重要的子类是:Error 和 Exception

Error:Error及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,代表的系统级别错误,是程序无法处理的错误(这属于严重问题,系统一旦出现这种问题,Java虚拟机(JVM)一般会选择线程终止。)

Exception:这类异常可以通过捕捉处理使程序继续执行,是程序自身可以处理的异常,也称为非致命性异常类。根据错误发生原因可分为运行时异常(RuntimeException)和除RunTimeException之外的编译时异常

就是说异常与错误是有区别的,异常可以通过程序自身捕捉处理,而错误是程序自身无法处理的。

1.2、运行时异常和编译时异常的区别?

运行时异常:RuntimeException本身和其子类;运行时异常在编译阶段没有错误提示,因为Java编译器不会检查它,当程序中出现这类异常时,也会编译通过,在运行时这类异常才会出现错误提示;一般是由于参数传递错误带来的问题

编译时异常:这类异常是没有继承RuntimeExcpetion的异常,直接继承于Excpetion;在编译阶段需要进行处理,然后就会错误提示,作用在于提醒程序员

程序中应当尽可能去处理这两种异常

异常的作用:

        (1)异常是用来查询bug的关键参考信息

        (2)异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

2、异常的用法

 2.1、捕获异常

捕获异常书写格式:

try {

        //可能出现异常的代码;

} catch(异常类名 变量名){

        //异常的处理代码;

} finally {

        //不管前面的try有没有捕获到异常,被finally控制的语句一定会执行,除非IVM退出

}

捕获异常的目的:当代码出现异常时,可以让程序继续往下执行。

捕获异常示例:

在下面代码中的try中写了一条有数组越界异常的代码,然后用catch去捕获异常,看看之后的代码会不会继续执行

public static void main(String[] args) {int[] arr = {1,3,2,4,5};try {System.out.println(arr[10]);//此处出现了异常,程序就会在这里创建一个ArrayIndex0utOfBoundsException对象//new ArrayIndexOutofBoundsException();//拿着这个对象到catch的小括号中对比,看括号中的变量是否可以接收这个对象1//如果能被接收,就表示该异常就被捕获(抓住),执行catch里面对应的代码//当catch里面所有的代码执行完毕,继续执行try...catch体系下面的其他代码} catch (ArrayIndexOutOfBoundsException e) {//如果出现了ArrayIndex0utOfBoundsException异常,我该如何处理System.out.println("索引越界了");}System.out.println("看看我执行了吗");
}

运行结果

捕获异常时的各种情况 :

        (1)如果try中没有遇到问题,系统会把try里面所有的代码全部执行完毕,不会执行catch里面的代码。注意:只有当出现了异常才会执行catch里面的代码

        (2)如果try中遇到多个问题,要写多个catch与之对应,并且如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面。了解:在JDK7之后,我们可以在catch中同时捕获多个异常,中间用 | 进行隔开表示如果出现了A异常或者B异常的话,采取同一种处理方案

        (3)如果try中遇到的问题没有被捕获,相当于try...catch的代码白写了,最终还是会交给虚拟机进行处理。

        (4)如果try中遇到了问题,那么下面的代码就不会执行了,直接跳转到对应的catch当中,执行catch里面的语句体,但是如果没有对应catch与之匹配,那么还是会交给虚拟机进行处理。

2.2、异常中的常见方法

Throwable 的成员方法

方法名称 ;说明

public String getMessage()返回此 throwable 的详细消息字符串

public string toString()返回此可抛出的简短描述

public void printStackTrace()把异常的错误信息输出在控制台

注意:仅仅是打印出错误信息,并不会停止程序运行

 方法示例:

public String getMessage()和  public string toString()示例

public static void main(String[] args) {int[] arr = {1,3,2,4,5};try {System.out.println(arr[10]);} catch (ArrayIndexOutOfBoundsException e) {String message = e.getMessage();System.out.println(message);//打印 Index 10 out of bounds for length 5String str = e.toString();System.out.println(str);//打印 java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 5//e.printStackTrace();}System.out.println("看一下我执行了没有");
}

 结果:

 public void printStackTrace()示例

public static void main(String[] args) {int[] arr = {1,3,2,4,5};try {System.out.println(arr[10]);} catch (ArrayIndexOutOfBoundsException e) {e.printStackTrace();}System.out.println("看一下我执行了没有");
}

结果:

扩展:用System.err.println打印出来的信息是红色的

//正常的输出语句
System.out.println(123);
//错误的输出语句(而是用来打印错误信息)
System.err.println(123);

2.3、抛出异常

抛出异常处理有两种方式是:throw 和 throws

throws

注意:写在方法定义处,表示声明一个异常

告诉调用者,使用本方法可能会有哪些异常

public void 方法()throws 异常类名1,异常类名2 . . . {

. . .

}

编译时异常:必须要写;运行时异常:可以不写。

throw

注意:写在方法内,结束方法

手动抛出异常对象,交给调用者

方法中下面的代码不再执行了

public void 方法(){

throw new NullPointerException();

}

 示例:

public static void main(String[] args) {//        需求://        定义一个方法求数组的最大值int[] arr = {};int max = 0;try {max = getMax(arr);} catch (NullPointerException e) {System.out.println("数组空指针异常");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组索引越界异常");}System.out.println(max);
}public static int getMax(int[] arr) {if (arr == null) {//手动创建一个异常对象,并把这个异常交给方法的调用者处理//此时方法就会结束,下面的代码不会再执行了throw new NullPointerException();}if (arr.length == 0) {//手动创建一个异常对象,并把这个异常交给方法的调用者处理//此时方法就会结束,下面的代码不会再执行了throw new ArrayIndexOutOfBoundsException();}int max = arr[0];for(int i=1; i<arr.length; i++) {if (max < arr[i]) {max = arr[i];}}return max;
}

2.4、自定义异常

自定义异常书写步骤:

        (1)定义异常类

        (2)写继承关系

        (3)空参构造

        (4)带参构造

自定义异常定义时取名意义:就是为了让控制台的报错信息更加的见名之意

 示例:

自定义异常NameFormException

public class NameFormException extends RuntimeException{//技巧://NameFormat:当前异常的名字,表示姓名格式化问题//Exception:表示当前类是一个异常类//运行时:自定义的异常就继承 RuntimeException 核心 就表示由于参数错误而导致的问题//编译时:自定义的异常就继承 Exception 核心 提醒程序员检查本地信息public NameFormException() {}public NameFormException(String message) {super(message);}
}

自定义AgeOutOfBoundsException

public class AgeOutOfBoundsException extends RuntimeException{public AgeOutOfBoundsException() {}public AgeOutOfBoundsException(String message) {super(message);}
}

定义Student类,如果在给属性name和age赋值时,数据不符合要求时就抛出相应的自定义异常

public class Students {private String name;private int age;public Students() {}public Students(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {int len = name.length();if (len < 3 || len >10) {throw new NameFormException(name + "格式有误,名字长度应为3~10");}this.name = name;}public int getAge() {return age;}public void setAge(int age) {if (age < 18 || age > 40) {throw new AgeOutOfBoundsException(age + "超出18~40这个范围");}this.age = age;}public String toString() {return "student{ name = " + name + ", age = " + age + " }";}
}

测试类Test

public class Test {public static void main(String[] args) {//1.创建键盘录入的对象ScannerScanner sc = new Scanner(System.in);//2.创建学生的对象Students stu = new Students();while (true) {try {System.out.println("请输入学生姓名");String name = sc.nextLine();stu.setName(name);System.out.println("请输入学生年龄");String ageStr = sc.nextLine();int age = Integer.parseInt(ageStr);stu.setAge(age);//如果所有的数据都是正确的,那么跳出循环break;} catch (NumberFormatException e) {e.printStackTrace();} catch (NameFormException e) {e.printStackTrace();} catch (AgeOutOfBoundsException e) {e.printStackTrace();}}System.out.println(stu);}
}

 推荐:

【计算机网络】DHCP原理与配置-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136230649?spm=1001.2014.3001.5501

【数据结构】二叉查找树和平衡二叉树,以及二者的区别_二叉查找树和其他二叉树的区别-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136137098?spm=1001.2014.3001.5501

【数据结构】前缀树的模拟实现-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/136086068?spm=1001.2014.3001.5501

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

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

相关文章

责任链模式(Chain of Responsibility Pattern)

责任链模式 说明 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;属于行为型模式&#xff0c;它是指使多个对象都有机会处理请求&#xff0c;将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。从而避免请求…

IntelliJ IDEA自定义关闭当前文件的快捷方式

前言 idea中关闭当前标签页的默认快捷键是CtrlF4,这个组合键在键盘上操作起来很是不方便&#xff0c;我们可以在设置中自定义自己习惯的快捷方式。 自定义步骤 要在 IntelliJ IDEA 中将关闭当前文件的快捷方式设置为 Alt Q&#xff0c;请按照以下步骤操作&#xff1a;打开 …

github Commits must have verified signatures

1.首先确认是否有权限&#xff0c;如有权限的情况下那就是配置有问题了 我的情况是&#xff0c;能拉取代码&#xff0c;提交的时候出现这种情况&#xff1a;Commits must have verified signatures 这里是生成证书&#xff0c;如果已经生成过的&#xff0c;就不用生成了 ssh…

ARM/Linux嵌入式面经(一):海康威视

海康威视 1.函数指针和指针函数区别 1.定义的差异 函数指针&#xff1a;函数指针的定义涉及到函数的地址。例如&#xff0c;定义一个指向函数的指针 int (*fp)(int)&#xff0c;这里 fp 是一个指针&#xff0c;它指向一个接受一个整数参数并返回整数的函数。 指针函数&#…

《C缺陷和陷阱》-笔记(2)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、理解函数声明 1.(*(void(*)( ))0)( ); 2.signal 函数接受两个参数&#xff1a; 3.使用typedef 简化函数声明&#xff1a; 二、运算符的优先级…

【项目】Boost 搜索引擎

文章目录 1.背景2.宏观原理3.相关技术与开发环境4. 实现原理1.下载2.加载与解析文件2.1获取指定目录下的所有网页文件2.2. 获取网页文件中的关键信息2.3. 对读取文件进行保存 3.索引3.1正排与倒排3.2获取正排和倒排索引3.3建立索引3.3.1正排索引3.3.2倒排索引 4.搜索4.1 初始化…

UNIAPP微信小程序中使用Base64编解码原理分析和算法实现

为何要加上UNIAPP及微信小程序&#xff0c;可能是想让检索的翻围更广把。&#x1f607; Base64的JS原生编解码在uni的JS引擎中并不能直接使用&#xff0c;因此需要手写一个原生的Base64编解码器。正好项目中遇到此问题&#xff0c;需要通过URLLink进行小程序跳转并携带Base64参…

Linux第73步_学习Linux设备树和“OF函数”

掌握设备树是 Linux驱动开发人员必备的技能&#xff01; 1、了解设备树文件 在3.x版本以前的Linux内核源码中&#xff0c;存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹&#xff0c;里面很多个“.c”和“.h”文件&#xff0c;它们用来描述设备信息。而现在的A…

MySQL实战:SQL优化及问题排查

有更合适的索引不走&#xff0c;怎么办&#xff1f; MySQL在选取索引时&#xff0c;会参考索引的基数&#xff0c;基数是MySQL估算的&#xff0c;反映这个字段有多少种取值&#xff0c;估算的策略为选取几个页算出取值的平均值&#xff0c;再乘以页数&#xff0c;即为基数 查…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放Video Mixer多路视频拼接应用本方案的SDI接收OSD动态字符叠加…

【ARM Trace32(劳特巴赫) 高级篇 21 -- SystemTrace ITM 使用介绍】

文章目录 SystemTrace ITMSystemTrace ITM 常用命令Trace Data AnalysisSystemTrace ITM CoreSight ITM (Instrumentation Trace Macrocell) provides the following information: Address, data value and instruction address for selected data cyclesInterrupt event info…

Maven基础简介

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;spring等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; Maven简介 Maven是什么 Maven…

Qt5.14.2揭秘Qt与SSL/TLS的完美邂逅:打造坚不可摧的网络安全防线

引言&#xff1a; 在数字化时代&#xff0c;数据安全是每个开发者和用户都不可忽视的问题。Qt&#xff0c;作为一个强大的跨平台开发框架&#xff0c;为我们提供了丰富的网络功能&#xff0c;其中就包括了对SSL/TLS加密通信的支持。本文将带你深入了解如何在Qt中实现SSL证书认证…

JVM的工作流程

目录 1.JVM 简介 2.JVM 执行流程 3. JVM 运行时数据区 3.1 堆&#xff08;线程共享&#xff09; 3.3 本地方法栈&#xff08;线程私有&#xff09; 3.4 程序计数器&#xff08;线程私有&#xff09; 3.5 方法区&#xff08;线程共享&#xff09; 4.JVM 类加载 ① 类…

软件测试的就业前景如何?

近年来&#xff0c;进入软件测试的就业人数逐渐增加。现在的社会对软件测试这个职业都有很大的需求。也有很多刚步入社会的年轻人想学习软件测试。那么你知道学习软件测试的的发展前景怎么样吗?看看下面的详细介绍。 关于软件测试行业发展前景问题&#xff0c;是很多准备入行…

c++ 常用的STL

前言 写这篇博客目的是为了记录在刷算法题中使用过的STL&#xff0c;因为有些不太常用的会遗忘。这篇博客只是作为笔记&#xff0c;不是详细的STL&#xff0c;因此只会对常用方法说明&#xff0c;不会详细介绍。此外在后面用到新的STL内容时会再补充。 列队 基础列队 基本列…

【python】time库知识整理

简介 python的time库是python内置库&#xff0c;主要负责处理与时间相关的事务。 获取当前时间 函数作用time()获取当前时间戳ctime()获取字符串形式的时间gmtime()调用内部方法&#xff0c;赋予属性&#xff0c;能够被程序调用执行 time返回的是时间戳 ctime是返回的我们…

MPU6050详解

文章目录 前言MPU6050简介MPU6050参数 硬件电路MPU6050框图电荷泵的原理 内部时钟生成需要使用的寄存器&#xff08;常用&#xff09;采样率划分器配置寄存器陀螺仪配置寄存器加速度计配置寄存器加速度计测量寄存器温度测量寄存器陀螺仪测量寄存器电源管理1寄存器电源管理2寄存…

Tomcat实现java博客项目、状态页及常见配置介绍

目录 一、自建博客 1. 项目背景 2. 操作示例 二、状态页 1. 概述 2. server status 信息状态页 3. manager app 项目管理状态页 4. host manger 虚拟主机管理状态页 三、常见配置 1. 端口8005/tcp安全配置管理 2. tomcat端口号 3. 虚拟主机设置 4. Context配置 一…

R语言自定义颜色

一、创建颜色梯度&#xff08;渐变色&#xff09; 在绘热图时&#xff0c;需要将数值映射到不同的颜色上&#xff0c;这时就需要一系列的颜色梯度colorRampPalette 函数支持自定义的创建一系列的颜色梯度。 代码示例&#xff1a; library(RColorBrewer)x <- colorRampPal…