Java学习教程,从入门到精通,Java throw和throws 关键字语法知识点及案例代码(47)

throwthrows 是 Java 中用于处理异常的两个关键字。下面是它们的基本语法和简单案例代码,以帮助初学者理解。

1. throw 关键字

throw 关键字用于手动抛出一个异常对象。通常在某个方法中,当你检测到错误条件时,可以创建一个异常对象并使用 throw 将其抛出。

语法:
throw new ExceptionType("Error message");

2. throws 关键字

throws 关键字用于在方法签名中声明该方法可能会抛出的异常类型。调用该方法的代码需要处理这些声明的异常(通过 try-catch 块或者继续向上层方法传递)。

语法:
ReturnType methodName() throws ExceptionType1, ExceptionType2 {// 方法体
}

案例代码

以下是一个简单的 Java 程序,展示了 throwthrows 的使用。

// 自定义异常类
class CustomException extends Exception {public CustomException(String message) {super(message);}
}public class ExceptionDemo {// 使用 throws 声明该方法可能抛出 CustomExceptionpublic static void mightThrowException(boolean flag) throws CustomException {if (flag) {// 使用 throw 手动抛出异常throw new CustomException("An error occurred!");} else {System.out.println("No error occurred.");}}public static void main(String[] args) {try {// 调用可能抛出异常的方法mightThrowException(true);} catch (CustomException e) {// 捕获并处理异常System.err.println("Caught CustomException: " + e.getMessage());}// 再次调用该方法,但这次不会抛出异常try {mightThrowException(false);} catch (CustomException e) {// 这个 catch 块不会被执行,因为异常没有被抛出System.err.println("This should not be printed.");}}
}

代码解释

  1. 自定义异常类 CustomException

    • 继承自 Exception 类,允许我们创建自定义异常对象。
  2. 方法 mightThrowException(boolean flag)

    • 使用 throws 关键字声明该方法可能会抛出 CustomException
    • 在方法内部,根据传入的 flag 值决定是否抛出异常。
  3. main 方法

    • 调用 mightThrowException(true) 时,会抛出 CustomException,并在 catch 块中捕获并处理它。
    • 调用 mightThrowException(false) 时,不会抛出异常,因此 catch 块不会被执行。

希望这个简单的例子能够帮助你理解 throwthrows 的用法!
当然,下面我将提供几个具体的 Java 案例代码,每个都包含详细的注释,以帮助您更好地理解 throwthrows 的使用。

案例 1:年龄验证

在这个案例中,我们将编写一个方法,该方法接受一个年龄作为参数,并检查该年龄是否小于 18。如果是,则抛出一个自定义异常。

// 自定义异常类,用于表示年龄小于 18 的情况
class UnderAgeException extends Exception {public UnderAgeException(String message) {super(message);}
}public class AgeValidator {// 方法声明,指出可能会抛出 UnderAgeExceptionpublic static void validateAge(int age) throws UnderAgeException {// 检查年龄是否小于 18if (age < 18) {// 抛出异常throw new UnderAgeException("Age " + age + " is under 18.");} else {// 如果年龄合法,打印确认信息System.out.println("Age " + age + " is valid.");}}public static void main(String[] args) {try {// 尝试验证一个不合法的年龄validateAge(16);} catch (UnderAgeException e) {// 捕获并处理异常System.err.println("Caught UnderAgeException: " + e.getMessage());}try {// 尝试验证一个合法的年龄validateAge(20);} catch (UnderAgeException e) {// 这个 catch 块不会被执行,因为异常没有被抛出System.err.println("This should not be printed.");}}
}

案例 2:文件读取异常处理

在这个案例中,我们将编写一个方法,该方法尝试读取一个文件,并在文件不存在时抛出一个 FileNotFoundException

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FileReaderDemo {// 方法声明,指出可能会抛出 FileNotFoundExceptionpublic static void readFile(String filePath) throws FileNotFoundException {// 创建文件对象File file = new File(filePath);// 检查文件是否存在if (!file.exists()) {// 抛出异常throw new FileNotFoundException("File not found: " + filePath);}// 创建 Scanner 对象来读取文件Scanner scanner = new Scanner(file);// 读取文件内容并打印到控制台while (scanner.hasNextLine()) {System.out.println(scanner.nextLine());}// 关闭 Scanner 对象scanner.close();}public static void main(String[] args) {// 尝试读取一个存在的文件(请确保路径正确)try {readFile("example.txt"); // 替换为您的文件路径} catch (FileNotFoundException e) {// 捕获并处理异常System.err.println("Caught FileNotFoundException: " + e.getMessage());}// 尝试读取一个不存在的文件(仅用于演示异常处理)try {readFile("nonexistentfile.txt");} catch (FileNotFoundException e) {// 捕获并处理异常System.err.println("Caught FileNotFoundException: " + e.getMessage());}}
}

注意:在第二个案例中,您需要确保 example.txt 文件存在于您的项目目录中,或者提供一个有效的文件路径。同时,nonexistentfile.txt 是不应该存在的,仅用于演示异常处理。
这两个案例展示了如何在 Java 中使用 throwthrows 来处理不同类型的异常情况。希望这些示例能够帮助您更好地理解这些概念!
当然,除了之前提供的两个案例外,这里还有更多关于Java异常处理的案例,每个案例都包含详细的注释以帮助理解。

案例 3:数组越界异常处理

在这个案例中,我们将展示如何捕获并处理数组越界异常。

public class ArrayIndexOutOfBoundsExceptionDemo {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};try {// 尝试访问数组的一个不存在的索引,这将抛出ArrayIndexOutOfBoundsExceptionint number = numbers[10];} catch (ArrayIndexOutOfBoundsException e) {// 捕获并处理异常System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());}// 正常的数组访问try {int number = numbers[2];System.out.println("Number at index 2: " + number);} catch (ArrayIndexOutOfBoundsException e) {// 这个catch块不会被执行,因为索引2是有效的System.err.println("This should not be printed.");}}
}

案例 4:除数为零异常处理

在这个案例中,我们将展示如何捕获并处理除数为零的异常。

public class ArithmeticExceptionDemo {// 方法声明,指出可能会抛出ArithmeticExceptionpublic static int divide(int numerator, int denominator) throws ArithmeticException {if (denominator == 0) {// 抛出异常throw new ArithmeticException("Denominator cannot be zero.");}return numerator / denominator;}public static void main(String[] args) {try {// 尝试进行除以零的操作,这将抛出ArithmeticExceptionint result = divide(10, 0);} catch (ArithmeticException e) {// 捕获并处理异常System.err.println("Caught ArithmeticException: " + e.getMessage());}// 正常的除法操作try {int result = divide(10, 2);System.out.println("Result of division: " + result);} catch (ArithmeticException e) {// 这个catch块不会被执行,因为除数2不是零System.err.println("This should not be printed.");}}
}

案例 5:自定义异常类并抛出

在这个案例中,我们将创建一个自定义异常类,并在需要时抛出它。

// 自定义异常类
class CustomException extends Exception {public CustomException(String message) {super(message);}
}public class CustomExceptionDemo {// 方法声明,指出可能会抛出CustomExceptionpublic static void doSomethingRisky() throws CustomException {// 根据某些条件抛出自定义异常boolean errorCondition = true; // 假设这是某种错误条件if (errorCondition) {throw new CustomException("Something went wrong!");}System.out.println("No error occurred.");}public static void main(String[] args) {try {// 尝试执行可能抛出自定义异常的方法doSomethingRisky();} catch (CustomException e) {// 捕获并处理自定义异常System.err.println("Caught CustomException: " + e.getMessage());}}
}

案例 6:使用finally块释放资源

在这个案例中,我们将展示如何使用finally块来确保资源(如文件输入流)在异常发生时也能被正确释放。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FinallyBlockDemo {public static void main(String[] args) {FileInputStream fis = null;try {// 尝试打开文件输入流fis = new FileInputStream("example.txt");// 读取文件内容(省略具体实现)} catch (FileNotFoundException e) {// 捕获并处理FileNotFoundExceptionSystem.err.println("Caught FileNotFoundException: " + e.getMessage());} finally {// 无论是否发生异常,都尝试关闭文件输入流if (fis != null) {try {fis.close();} catch (IOException e) {// 捕获并处理IOException(关闭文件时可能发生)System.err.println("Error closing file: " + e.getMessage());}}}// 或者使用try-with-resources语句自动关闭资源(Java 7及以上版本)try (FileInputStream fis2 = new FileInputStream("example.txt")) {// 读取文件内容(省略具体实现)} catch (FileNotFoundException e) {// 捕获并处理FileNotFoundExceptionSystem.err.println("Caught FileNotFoundException: " + e.getMessage());} catch (IOException e) {// 捕获并处理IOException(虽然在这个例子中不太可能发生,但为完整性而添加)System.err.println("IOException occurred: " + e.getMessage());}}
}

这些案例涵盖了Java异常处理的不同方面,包括捕获和处理标准异常、自定义异常、使用finally块释放资源等。希望这些案例能够帮助您更好地理解Java异常处理的概念和用法。

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

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

相关文章

【Django-xadmin】

时间长不用,会忘的系列 1、Django-xadmin后台字段显示处理 主要是修改每个模块下adminx.py文件 代码解释&#xff1a;第1行控制表单字段显示第2行控制列表字段显示第3行控制搜索条件第4行控制过滤条件第5行支持单个或多个字段信息修改第6行列表分页&#xff0c;每页显示多少行…

【HM-React】02. React基础-下

React表单控制 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 function App(){const [value, setValue] useState()return (<input type"text" value{value} onChange{e > setValue(e.target.value)}/>) …

朗迪锋亮相2024人因工程与智能系统交互国际会议

2024年11月28日至30日&#xff0c;2024人因工程与智能系统交互国际会议在深圳隆重举办。此次大会以推动我国人因工程学科发展为目标&#xff0c;致力于加强国际学术交流&#xff0c;深入探讨人工智能时代的智能系统交互&#xff0c;旨在培育新质生产力&#xff0c;助力经济社会…

基于Java Springboot房屋租赁App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

【小白学机器学习42】进行多次抽样,样本的分布参数和总体的分布参数的关系

目录 1 进行多次抽样&#xff0c;样本的分布参数和总体的分布参数的关系 2 样本容量越大&#xff0c;多次抽样的样本的分布参数和总体的分布参数的关系 2.1 如果进行多次抽样&#xff0c;样本的均值将趋向总体的均值 2.2 换句话说&#xff1a;样本的均值将趋向总体的均值就…

Spring Web开发(请求)获取JOSN对象| 获取数据(Header)

大家好&#xff0c;我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…

分布式爬虫那些事儿

什么是分布式爬虫&#xff1f; 假设你有一群小伙伴&#xff0c;他们每个人都在帮你剥花生壳&#xff0c;然后把剥好的花生仁都丢到你面前的盘子里。分布式爬虫也差不多&#xff0c;许多台电脑一起上阵&#xff0c;各自负责去同一个网站获取数据&#xff0c;这叫建立一个分布式…

CSS学习记录03

CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下&#xff1a; body {background-color: lightblue; } 通过CSS&#xff0c;颜色通常由以下方式指定&#xff1a; 有效的颜色名称-比如“…

Matlab mex- setup报错—错误使用 mex,未检测到支持的编译器...

错误日志&#xff1a; 在使用mex编译时报错提示&#xff1a;错误使用 mex&#xff0c;未检测到支持的编译器。您可以安装免费提供的 MinGW-w64 C/C 编译器&#xff1b;请参阅安装 MinGW-w64 编译器。有关更多选项&#xff0c;请访问https://www.mathworks.com/support/compile…

23种设计模式之外观模式

目录 1. 简介2. 代码2.1 SelectFoodService (选择食品)2.2 PayService (支付服务)2.3 TakeService (制作服务)2.4 OrderService (下单服务)2.5 Food (食品)2.6 TackingSystem &#xff08;外观类&#xff09;2.7 Test &#xff08;测试类&#xff09; 3. 优缺点3. 总结 1. 简介…

vue3 路由跳转携带参数以及其他页面接收参数

vue3 路由跳转携带参数以及其他页面接收参数 传参页面 <script setup> import { useRouter } from "vue-router"; const router useRouter();// 路由 const goToDetail () > {router.push({ path: /about, query: { id: 123 } }); }; function goToDeta…

MeterSphere VS 其他开源接口测试工具

对比项 swagger yapi postman httprunner2.x/3.x jmeter metersphere UI界面 支持支持支持 不支持&#xff08;无界面/UI不够便捷 脚本编写量大 文档不够清晰&#xff09; 支持支持 单接口 支持支持支持支持支持支持 业务场景自动化 不支持支持支持支持支持支持 操作数据…

STM32CUBEIDE FreeRTOS操作教程(十):interrupt on/off中断开关

STM32CUBEIDE FreeRTOS操作教程&#xff08;十&#xff09;&#xff1a;interrupt on/off中断开关 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发…

【系统架构设计师论文】微服务架构设计与实践

一、微服务架构概述 1.1 什么是微服务架构? 微服务架构(Microservices Architecture)是一种将应用程序拆分为多个小型服务的架构模式,每个服务都可以独立开发、部署、扩展,并通过轻量级的通信协议(通常是 HTTP/REST 或 gRPC)进行交互。这种架构的核心思想是将大型单体…

长安汽车嵌入式面试题及参考答案

数据结构中的堆栈和编程中的堆栈有什么区别? 在数据结构中,堆栈是一种抽象的数据类型。它遵循后进先出(LIFO)的原则。从操作角度来看,有入栈(push)和出栈(pop)操作。例如,想象有一个装有盘子的栈,只能从栈顶放入和取出盘子。数据结构中的堆栈主要关注其逻辑结构和操…

Python学习38天

class Person:def __init__(self, name, age, job):self.name nameself.age ageself.job job# 重写函数返回属性def __str__(self):return f"{self.name}--{self.age}--{self.job}"# 冒泡排序法 def bubble_sort(my_list: list[Person]):"""冒泡排…

Python 调用 Umi-OCR API 批量识别图片/PDF文档数据

目录 一、需求分析 二、方案设计&#xff08;概要/详细&#xff09; 三、技术选型 四、OCR 测试 Demo 五、批量文件识别完整代码实现 六、总结 一、需求分析 市场部同事进行采购或给客户报价时&#xff0c;往往基于过往采购合同数据&#xff0c;给出现在采购或报价的金额…

docker x86环境构建arm镜像出现failed to fetch oauth token问题

问题&#xff1a;最近在使用x86的MAC机器准备打包arm的镜像时使用命令如下 docker buildx build --platform linux/arm64 --load --no-cache -t deepface:v1-arm .出现连接问题 [] Building 31.7s (3/3) FINISHED …

C语言中map的用法和其他数据结构的区别

在C语言中&#xff0c;没有直接内置的map数据结构&#xff08;类似于C的std::map&#xff09;&#xff0c;但可以通过结构体、数组、链表或哈希表来实现类似功能。下面将从map的概念、实现方法和与其他数据结构的区别等方面进行详细讲解。 一、Map的概念 Map是一种键值对&…

【AI系统】AI 编译器基本架构

AI 编译器基本架构 在上一篇文章中将 AI 编译器的发展大致分为了 3 个阶段&#xff0c;分别为 1&#xff09;朴素编译器、2&#xff09;专用编译器以及 3&#xff09;通用编译器。 本文作为上一篇文章 AI 编译器架构的一个延续&#xff0c;着重讨论 AI 编译器的通用架构。首先…