异常处理(throw、throws、try-catch)

article/2025/9/14 0:07:06

Java异常处理的五个关键字try、catch、finally、throw、throws

1.抛出异常throw

在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接收参数。那么,当调用方法使用接收到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。

在Java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?

1.创建一个异常对象,封装一些提示信息(信息可以自己编写)。

2.需要将这个异常对象告知给调用者:通过关键字throw就可以完成。throw异常对象。

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

使用格式:

throw new 异常类名(参数);

注意:

1.throw关键字必须写在方法的内部

2.throw关键字后边new的对象必须是Exception或者是Exception的子类对象

3.throw关键字抛出指定的异常对象,我们就必须处理这个异常对象。

两种处理方式:

A.throw关键字后面创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)

public static void main(String[] args) {int[] arr = {1,2,3};int value = getElement(arr,3);System.out.println(value);
}private static int getElement(int[] arr, int index) {/*我们可以对传递的参数数组,进行合法性校验如果数组arr的值是null那么我们就抛出空指针异常,告知方法的调用者"传递的数组的值是null"*/if(arr == null){ // 空指针异常// throw用在方法内,用来抛出一个异常对象// 将这个异常对象传递到调用者处,并结束当前方法的执行。// NullPointerException是运行期异常RuntimeException异常的子类// 不用处理,默认交给JVM处理throw new NullPointerException("传递的数组的值是null");}/*对传递过来的参数index进行合法性校验如果index范围不在数组的索引范围内,就抛出"数组索引越界异常",告知方法的调用者*/if(index < 0 || index > arr.length - 1){// ArrayIndexOutOfBoundsException是运行期异常RuntimeException异常的子类throw new ArrayIndexOutOfBoundsException("数组索引越界异常");}int value = arr[index];return value;
}

运行截图:

代码规范:

必须对方法传过来的参数进行合法性校验,如果参数不合法,那么我们就必须使用抛出异常的方式,告知方法的调用者,传递的参数有问题

 

2.Objects非空判断

之前学过一个类Objects,由静态的实用方法组成,这些方法是null-save或null-torelent,那么在它的源码中,对对象为null的值进行了抛出异常操作。

public static <T> requireNonNull(T obj):查看指定引用对象不是null

public static <T> T requireNonNull(T obj) {if (obj == null)throw new NullPointerException();return obj;
}
public static void method(Objects obj){/*// 对传递过来的参数进行合法性判断,判断是否为nullif (obj == null) {throw new NullPointerException("传递的参数为null");*/// 第二种方法:调用Objects的方法// Objects.requireNonNull(obj);Objects.requireNonNull(obj,"该参数传递的值是null");}

B.throw关键字后面创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch

3.声明异常throws

声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲),那么必须通过throws进行声明,让调用者去处理。

关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。

声明异常格式:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2...{   }

注意:

1.throws关键字必须写在方法声明处

2.throws关键字后边声明的异常必须是Exception或者Exception的子类

3.方法内部如果抛出多个异常对象,那么throws后面必须也声明多个异常,如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可。

4.调用一个声明抛出异常的方法,就必须处理声明的异常,要么继续使用throws声明抛出交给方法的调用者,最终给JVM。要么try catch自己处理异常。

public static void main(String[] args) throws IOException {String fileName = "d:\\a.txt";// 继续使用thrxows声明异常,抛给JVMreadFile(fileName);
}
/*
定义一个方法,对传递的文件路径进行合法性判断
如果路径不是"c:\\a.txt",那么我们就抛出文件找不到异常对象,告知方法的调用者*/
public static void readFile(String fileName) throws IOException { // 加上throww声明异常// 返回给主方法if(!fileName.equals("c:\\\\a.txt")){ // 路径异常// 报错,编译异常throw new FileNotFoundException("传递的文件路径不是c:\\\\a.txt");}/*如果传递的路径,不是.txt结尾那么我们就抛出IO异常对象,告知方法的调用者,文件的后缀名不对*/// if(!fileName.split(".")[1].equals("txt") ){if(!fileName.endsWith(".txt")){// 报错,编译异常,需要声明throw new IOException("文件的后缀名不对");}System.out.println("路径没问题,读取文件");
}

4.捕获异常try...catch

如果异常出现的话,会立刻终止程序,所以我们得处理异常:

1.该方法不处理,而是声明抛出,由该方法得调用者来处理(throws)

2.在方法种使用try-catch的语句块来处理异常

try-catch的方法就是捕获异常

捕获异常:Java种对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。

捕获异常语法如下:

try{编写可能会出现异常的代码
}catch(异常类型 e){处理异常的代码//记录日志/打印异常信息/继续抛出异常        
}

注意:

1.try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象

2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕后catch中的处理逻辑,继续执行try...catch之后的代码

    如果try中没有产生异常,那么就不会执行catch中的异常处理逻辑,执行完毕后catch中的处理逻辑,继续执行try...catch之后的代码

public static void main(String[] args) {try{readFile("d:\\a.tt");}catch(IOException e){ // try中抛出什么异常对象,catch就定义什么异常变量,// 用来接收这个异常对象System.out.println(e);}// try catch执行后,继续执行后续代码System.out.println("后续代码");
}
public static void readFile(String fileName) throws IOException { // 加上throws声明异常/*如果传递的路径,不是.txt结尾那么我们就抛出IO异常对象,告知方法的调用者,文件的后缀名不对*/if(!fileName.endsWith(".txt")){// 报错,编译异常,需要声明throw new IOException("文件的后缀名不对");}System.out.println("路径没问题,读取文件");
}

运行截图:

 

 


http://chatgpt.dhexx.cn/article/tva7n4Gk.shtml

相关文章

SpringBoot+Axis2搭建WebService服务端

SpringBootAxis2搭建WebService服务端 之前用过Spring Axis2搭建过WebService项目&#xff0c;网上也有很多资料教程&#xff0c;最近需要在一个SpringBoot项目中添加Axis2的服务端&#xff0c;在网上找了很久&#xff0c;没有找到相关教程&#xff0c;最终经过大神朋友的指点…

AXI(2)完结

四、握手 4.1握手过程 所有的五个通道都是通过相同的VALID/READY握手处理来传输地址、数据和控制信息。 双向握手的机制意味着主机和从机之间传输数据时&#xff0c;都可以控制传输的速率&#xff0c;只有当VALID和READY同时为高电平时&#xff0c;传输才会发生。 发送方&a…

读Axis2用户帮助文档 (axis2中文文档)

作者&#xff1a;李红霞 时间&#xff1a;2006-10-19 声明&#xff1a;本文可以算作Axis2用户手册的翻译&#xff0c;但是翻译后的文本是经过作者理解写出来的&#xff0c;可能有些偏差&#xff0c;欢迎讨论。本文属作者原创&#xff0c;允许转载&#xff0c;但请注明出处。 英…

AXI 3.0 (1)

一、AXI简介 AMBA3.0中新增加了一种总线——AXI&#xff08;Advanced eXtensible Interface&#xff0c;高级扩展接口&#xff09;。 AMBA AXI 协议的目标是高性能、高频的系统设计&#xff0c;其包含了若干特性。 适合高带宽和低延迟的设计 提供高频操作&#xff0c;无需使…

Apache axis2 + Eclipse 开发 WebService

一、简介 Apache Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持&#xff0c;但它具有更强的灵活性并可扩展到新的体系结构。Axis2 基于新的体系结构进行了全新编写&#xff0c;而且没有采用 Axis 1.x 的常用代码。支持开发 Axis2 的动力是探寻模块化…

Axis2与Web项目整合

一、说明: 上一篇介绍了通过使用Axis2来发布和调用WebService&#xff0c;但是是把WebService发布在Axis2提供的项目中&#xff0c;如果我们需要在自己的Web项目中来使用Axis2发布WebService该怎么做呢&#xff1f; 本篇即介绍在Web项目中使用Axis2来发布WebService. 二、具体…

Axis2中文手册

中文原文 http://tenn.javaeye.com/blog/100736 英文原文 http://ws.apache.org/axis2/1_0/userguide.html 概述 这个说明文档涉及以下内容&#xff1a;  如何使用 axis2 创建 web service 和客户端程序  如何定制一个模块 (Module) 并在 web service 中使用它  Sam…

axis2的使用(转载)

通过axis2发起WS请求时添加SOAP header 首先要获得一个ServiceClient对象&#xff0c;因为这个对象是org.apache.axis2.client.Stub里面定义的&#xff0c;所以你生成的stub里面应该直接就可以使用这个对象&#xff0c;或者调用stub的_getServiceClient()方法来获取这个对象。 …

SpringBoot2 整合 AXIS2 服务端和客户端

文章目录 一、AXIS2服务端1. 版本选型2.导入依赖3. services.xml4.Axis2配置类5.服务接口6.服务接口实现类7. FileCopyUtils工具类8. 测试验证 二、AXIS2服务端2.1. 客户端类2.2. 服务调用测试开源源码. 一、AXIS2服务端 1. 版本选型 阿健/框架版本spring-boot2.5.5axis21.7.…

WebService之Axis2系列教程(一)Axis2的下载、安装和使用

Axis2是目前比较流行的WebService引擎。WebService被应用在很多不同的场景。例如&#xff0c;可以使用WebService来发布服务端 Java类的方法&#xff0c;以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。WebService还经常被使用在SOA中&#x…

Axis2 webservice学习总结

一、学习课件目录&#xff1a; Axis2(WebService)培训资料1 - 百度文库 (baidu.com) WebService大讲堂之Axis2 - 百度文库 (baidu.com) 二、学习总结&#xff1a; Web Service是构建互联网分布式系统的基本部件&#xff0c;它是一个应用程序&#xff0c;它向外界暴露出一个…

小白轻松使用axis2构建webservice

引言&#xff1a; 使用axis2是来实现webservice接口是比较常见的&#xff0c;就我来说&#xff0c;如果要学一个首次接触东西&#xff0c;简单了解相关基础概念后&#xff0c;就希望自己能够简单快速的实现一个例子&#xff0c;在学习一门开发语言的时候&#xff0c;一个hello…

模板引擎 Velocity语法

Velocity是一个基于java的模板引擎&#xff08;template engine&#xff09;&#xff0c;它允许任何人仅仅简单的使用模板语言&#xff08;template language&#xff09;来引用 由java代码定义的对象。作为一个比较完善的模板引擎&#xff0c;Velocity的功能是比较强大的&…

velocity 模板语法

velocity 模板语法 前言1. 访问1.1 变量1.2 属性1.3 方法 2. 指令2.1 #set 创建变量2.2 #if/#elseif/#else 分支控制2.3 #foreach 循环控制2.4 #include - 引入本地文件&#xff0c;文本展示2.5 #parse - 引入本地文件&#xff0c;velocity 解析后展示2.6 #stop - 停止模板解析…

finalize() 原理

finalize 方法的作用是&#xff1a; 如果对象在进行可达性分析后发现没有与 GC Roots 相连接的引用链&#xff0c;那他将会被第一次标记并且进行一次筛选&#xff0c;筛选的条件是此对象是否有必要执行 finalize 方法。 注意&#xff1a;当对象没有覆盖 finalize 方法&#xf…

finalize()

注&#xff1a;本文的目的并不是鼓励使用finalize方法&#xff0c;而是大致理清其作用、问题以及GC执行finalize的过程。 1. finalize的作用 finalize()是Object的protected方法&#xff0c;子类可以覆盖该方法以实现资源清理工作&#xff0c;GC在回收对象之前调用该方法。fina…

java finalize方法详解

1. finalize的作用 finalize()是Object的protected方法&#xff0c;子类可以覆盖该方法以实现资源清理工作&#xff0c;GC在回收对象之前调用该方法。finalize()与C中的析构函数不是对应的。C中的析构函数调用的时机是确定的&#xff08;对象离开作用域或delete掉&#xff09;&…

java中finalize()方法

finalize 垃圾回收机器&#xff08;Garbage Collection&#xff09;,也叫GC&#xff0c;垃圾回收器主要有一下特点&#xff1a; 当对象不再被程序所使用的时候&#xff0c;垃圾回收器将会将其回收垃圾回收是在后台运行的&#xff0c;我们无法命令垃圾回收器马上回收资源&…

Finalize详解

finalize()方法详解&#xff0c;前言&#xff0c;finalize()是Object的protected方法&#xff0c;子类可以覆盖该方法以实现资源清理工作&#xff0c;GC在回收对象之前调用该方法。 finalize的作用: (1)finalize()与C中的析构函数不是对应的。C中的析构函数调用的时机是确定的…

finalize的理解

finalize的理解 一般的回答&#xff1a;它是Object中的一个方法&#xff0c;子类重写它&#xff0c;垃圾回收时候方法会被调用&#xff0c;可以再其中进行一些资源的解释和清理工作。 优秀的回答&#xff1a;将资源的释放和清理放在finalize方法中是非常不好的&#xff0c;影…