[JAVA] Java中如何使用throws语句声明异常类型

news2025/5/19 3:08:15

 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常

        — throws语句用在方法定义时声明该方法要抛出的异常类型

public void method() throws Exception1,Exception2,...ExceptionN{
            //可能产生异常的代码
}

 当方法抛出异常列表中的异常时,方法将不对这些类型及其子类类型的异常作处理,而抛向调用该方法的方法,由他去处理

例如;

public static int test() throws ArithmeticException{//这段代码告诉编译器这个方法当中可能会抛出一个算数异常,谁调用谁处理
	Scanner input =new Scanner(System.in);
	System.out.println("=====运算开始=====");
	System.out.print("请输入第一个整数:");
	int one=input.nextInt();
	System.out.println("请输入第二个整数");
	int two=input.nextInt();
	System.out.println("=====运算结束=====");
	return one/two;
}

这段代码中throws  ArithmeticException告诉编译器这段代码可能会抛出算数异常

那么我们需要在调用的位置输入try - catch处理(谁调用谁处理)

 public static void main(String[] args) {
   try {
	   int result =test(); //调用test方法
	   System.out.println("one和two的商是:"+result);
       } catch (ArithmeticException e) {   //捕获异常
	   // TODO 自动生成的 catch 块
   System.out.println("除数不允许为0");
   e.printStackTrace();
}

 运行结果

可以看出,利用throws在方法体中抛出可能出现的异常,然后调用时用try—catch就可以捕获出用户可能输入错误的数值。

如果我们预测这段方法体代码可能出现多种不同类型的异常,我们可以通过多异常抛出的方法,通过逗号,间隔多种异常的类型

public static int test() throws ArithmeticException,InputMismatchException{

}

此时调用时也需要将这两个可能出现的异常分别用try --catch捕获

public class TryDemoThree {
   public static void main(String[] args) {
   try {
	int result =test(); 
	   System.out.println("one和two的商是:"+result);

}  catch (ArithmeticException e) {
	System.out.println("除数不允许为0");
	e.printStackTrace();

}  catch (InputMismatchException e) {
	System.out.println("请输入整数");
	e.printStackTrace();
}
}
}

此时,我们如果输入不符合要求的数值,编译器便会产生提示

我们在什么情况下,需要使用到这种捕获和处理异常的代码块呢?

在程序编写的过程中,我们编写捕获和处理异常的代码块去规避可能出现的风险,同时也可以利用它去完成一些程序的逻辑和项目当中需要某些特殊需求和特定任务处理

比如,我们假设这样的一个场景,当我们去某些酒店入住,入住要求为 18岁以下或者80岁以上,必须由亲属陪同入住,不能单独入住。这种限制条件就需要我们通过抛出异常和处理异常的方式进行解决

//描述酒店入住规则:未满18或80岁以上需亲友陪同
public static void testAge() {
	System.out.println("请输入你的年龄:");//提示用户输入年龄
	Scanner input=new Scanner(System.in);//接受用户输入信息
	int age=input.nextInt();
	
	if(age<18 || age>80) {
		//针对入住条件作出异常处理
		throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同");

	}else {
	System.out.println("欢迎入住本酒店");
	}

	
}
}

在 throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同"); 中提示我们需要添加抛出声明 

第1种异常处理方法 添加try—catch,自己抛出的异常自己处理

第2种异常处理方法 用throws把异常抛出去,谁调谁处理

throw抛出异常对象的处理方案

1.通过try......catch包含throw语句----自己抛自己处理

public class TryDemoFour {
	public static void main(String[] args) {
		testAge(); //调用
	}


public static void testAge() {
	try {
	     System.out.println("请输入你的年龄:");//提示用户输入年龄
	     Scanner input=new Scanner(System.in);//接受用户输入信息
	     int age=input.nextInt();
	     if(age<18 || age>80) {
		//针对入住条件抛出异常
		 throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同");
	     }else {
	     System.out.println("欢迎入住本酒店");
	     }
	}catch(Exception e) {
		 e.printStackTrace();
	}
	
}

运行结果 (用户输入的信息不符合要求,提示了异常信息 )

2.通过throws在方法声明出抛出异常类型--谁调用谁处理--调用者可以自己处理,也可以继续上抛 

public class TryDemoFour {
	public static void main(String[] args) {
  
	try {  
		testAge();  //调用者使用try--catch处理
	}catch(Exception e) {
		e.printStackTrace();
	}
	}   


public static void testAge() throws Exception  { //声明异常类型  
	     System.out.println("请输入你的年龄:");//提示用户输入年龄
	     Scanner input=new Scanner(System.in);//接受用户输入信息
	     int age=input.nextInt();
	     if(age<18 || age>80) {
		//针对入住条件抛出异常
		 throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同");
	     }else {
	     System.out.println("欢迎入住本酒店");
	     }
	}
	
}

同样,也正常输出了提示信息 

 

 在了解了throws声明异常后,我们可以再学习另一种声明异常的方法:

自定义异常类

  •       在程序当中,我们可以使用Java内置的异常类可以描述在编程时出现的大部分异常情况
  •       也可以通过自定义异常描述特定业务产生的异常类型
  •       所谓自定义异常,就是定义一个类,去继承Throwable类或者它的子类

创建自定义的异常类需要继承自Exception类,并提供含有一个无参的构造方法,该信息可以通过异常类的getMessage( )方法获得

自定义异常类代码如下:

public class HotelAgeException extends Exception {  //创建一个自定义异常类
  public HotelAgeException() {
	  super("18岁以下,80岁以上的住客必须由亲友陪同");
  }
}

在该类中对用户输入的值进行判断,如年龄不符合要求,则调用自定义异常HotelAgeException,处理程序所发生的异常

package com.test;
import java.util.Scanner;

public class TryDemoFour {
	public static void main(String[] args) {
	try {                      //对抛出的异常进行处理
		testAge();
	}catch(HotelAgeException e) {
		 System.out.println(e.getMessage());  //输出异常信息
	}catch(Exception e) {
		e.printStackTrace();
	
	}
	}   
public static void testAge() throws  HotelAgeException{
	     System.out.println("请输入你的年龄:");//提示用户输入年龄
	     Scanner input=new Scanner(System.in);//接受用户输入信息
	     int age=input.nextInt();
	     if(age<18 || age>80) {    //判断用户输入的值是否符合要求
		//针对入住条件作出抛出异常
		 throw new HotelAgeException();//抛出异常
	     }else {
	     System.out.println("欢迎入住本酒店");
	     }
	}
	
}

运行结果

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

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

相关文章

LVS配置

基础介绍 http://t.csdnimg.cn/Lv5Byhttp://t.csdnimg.cn/Lv5By 部署NAT模式集群案例 实验环境 主机名 IP vip 角色 node1 192.168.0.100 172.25.254.100 调度器&#xff08; VS &#xff09; node1 192.168.0.101 &#xff0c; GW 192.168.0.100 \ 真实服务器&#…

HarmonyOS开发案例:创建全局自定义组件复用池-BuilderNode

介绍 本示例是全局自定义组件复用实现的示例代码&#xff0c;主要讲解如何通过BuilderNode创建全局的自定义组件复用池&#xff0c;实现跨页面的组件复用。 效果图预览 使用说明 继承NodeController&#xff0c;实现可复用的NodeItem组件。使用单例模式创建NodePool组件复用…

leetcode算法题之N皇后

N皇后也是一道很经典的问题&#xff0c;问题如下&#xff1a; 题目地址 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你…

2:html:基础语法2

目录 2.1图像的一些注意点 2.2表格 2.2.1基本的表格 2.2.2表头与边框 2.3列表 2.3.1无序列表 2.3.2有序列表 2.4块 2.4.1块级元素 2.4.2内联元素 2.1图像的一些注意点 在上一篇中&#xff0c;我们已经知道了怎么样去将图片运用到我们的网站中&#xff0c;但是这里还…

荣耀Magicbook x14 扩容1TB固态

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 固态硬盘规格 在官网查看加装固态硬盘的接口规格 https://www.honor.com/cn/laptops/honor-magicbook-x14-2023/ https://club.honor.com/cn/thread-2847379…

XYplorer v26.30.0200绿色版

软件介绍 XYplorers是一款多标签文件管理器&#xff0c;支持多标签页栏&#xff0c;浏览文件管理时就跟使用Chrome之类的浏览器感觉一般&#xff0c;从浏览方便性&#xff0c;和切换滑顺程度&#xff0c;要比原本Windows10的Explorer文件管理器要得多。可以大部分程度上替代系…

树莓派5环境配置笔记 新建虚拟python环境—安装第三方库—配置Thonny解释器

树莓派5虚拟环境配及第三方库的安装&#x1f680; 在完成了树莓派的系统下载和各项基础配置之后进入到了&#xff0c;传感器开发部分&#xff0c;在测试传感器开发之前我打算先安装一下自己需要的库&#xff0c;但是在我直接在系统的根目录下运行pip命令的时候总会报环境错误&a…

sudo执行带重定向命令时仍提示无权限:Permission denied问题详解以及linux里的更高效下载命令mwget安装和使用效率对比

一、sudo执行带重定向命令时仍提示无权限&#xff1a;Permission denied问题详解 小问题&#xff0c;在此记录一下&#xff0c;有时在shell下执行命令重定向到文件时提示无权限-bash: temp_20181015.log: Permission denied&#xff0c;而且加sudo执行依提示无权限&#xff0c;…

CDD数据库文件制作(四)——Data Type(0x22/0x2E)

文章目录 1、新建Data Type步骤2、Data Types类型2.1 raw value2.1.1 ASCII读取和写入:零件号…2.1.2 “多字节的十六进制” 读取和写入:密钥,种子…2.1.3 “多字节的十进制” 读取和写入:参数标定和显示2.2 text table2.3 Linear2.3.1 分辨率和偏移量非1和0的读取和写入2.…

linux:进程优先级、环境变量、地址空间

进程优先级 什么叫进程优先级&#xff1f; 进程优先级是指进程获取某些资源的先后顺序 上文中的task_struct&#xff0c;也叫进程控制块&#xff08;PCB&#xff09;&#xff0c;本质上是结构体&#xff0c;我们的优先级就被写在结构体里面&#xff08;内部字段&#xff09;…

Python | Leetcode Python题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; class Solution:def reverseVowels(self, s: str) -> str:def isVowel(ch: str) -> bool:return ch in "aeiouAEIOU"n len(s)s list(s)i, j 0, n - 1while i < j:while i < n and not isVowel(s[i]):i 1while j …

模型 神经网络(通俗解读)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。仿脑智能&#xff0c;深度学习&#xff0c;精准识别。 1 神经网络的应用 1.1 鸢尾花分类经典问题 神经网络的一个经典且详细的经典应用是鸢尾花分类问题 。主要是通过构建一个神经网络模型来自动区分…

【数学建模备赛】Ep04:假设性检验

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、假设性检验&#xff1a;☀️☀️☀️1. 整体步骤2. 例子① 确定原假设和备择假设② 根据要检测的量构造一个分布③ 画出分布的概率密度图④ 给出一个置信水平β⑤ 最常见的置信水平&#xff08;95 %&#xff09;⑥…

Java流程控制07:嵌套for循环

本节教学视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌嵌套for循环是指将…

Linux之HTTP服务器的构建

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 参考环境参考书籍一、HTTP的工作原理1. 建立连…

k8s查看容器的日志

查询运行容器命令&#xff1a;kubectl get po -n pro 如果想查看cams系统&#xff0c;那么执行命令&#xff1a; kubectl logs pro -f -n pro &#xff08;容器名称&#xff09;|more

【HarmonyOS】端云一体化初始化项目

简介 端云一体化开发是HarmonyOS对云端开发的支持、实现端云联动。云开发服务提供了云函数、云数据库、云存储等服务&#xff0c;可以使开发者专注于应用的业务逻辑开发&#xff0c;无需关注基础设施&#xff0c;例如&#xff1a;服务器、操作系统等问题。 因此&#xff0c;…

CentOS下分布式消息系统kafka的安装和使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前沿一、Windows主机&#xff08;G:\share&#xff09;和Linux虚拟机&#xff08;/mnt/hgfs/share&#xff09;之间文件共享1.添加Windows主机的路径2.linux安装VMw…

比特位的计算

给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1 --> …

我的创作纪念日【2048】

机缘 2048&#xff0c;是计算机二进制世界里很奇妙的数字&#xff0c;在CSDN上创作的第六年&#xff0c;记录从事本行业的知识学习与总结&#xff0c;好记性不如烂笔头&#xff0c;或许写的东西不如大佬的文章&#xff0c;那么有深度&#xff0c;但自己也是在坚持&#xff0c;…