1.10 throws和throw:声明和抛出异常

2023-11-15

Java 中的异常处理除了捕获异常和处理异常之外,还包括声明异常和拋出异常。

实现声明和抛出异常的关键字非常相似,它们是 throws 和 throw

可以通过 throws 关键字在方法上声明该方法要拋出的异常,然后在方法内部通过 throw 拋出异常对象。

本节详细介绍在 Java 中如何声明异常和拋出异常。

throws 声明异常

当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。使用 throws 声明的方法表示此方法不处理异常。throws 具体格式如下:

returnType method_name(paramList) throws Exception 1,Exception2,{}

其中,returnType 表示返回值类型;method_name 表示方法名;paramList 表示参数列表;Exception 1,Exception2,… 表示异常类。

如果有多个异常类,它们之间用逗号分隔。这些异常类可以是方法中调用了可能拋出异常的方法而产生的异常,也可以是方法体中生成并拋出的异常。

使用 throws 声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由向上一级的调用者处理;如果 main 方法也不知道如何处理这种类型的异常,也可以使用 throws 声明抛出异常,该异常将交给 JVM 处理。JVM 对异常的处理方法是,打印异常的跟踪栈信息,并中止程序运行,这就是前面程序在遇到异常后自动结束的原因。

例 1
创建一个 readFile() 方法,该方法用于读取文件内容,在读取的过程中可能会产生 IOException 异常,但是在该方法中不做任何的处理,而将可能发生的异常交给调用者处理。在 main() 方法中使用 try catch 捕获异常,并输出异常信息。代码如下:

import java.io.FileInputStream;
import java.io.IOException;

public class  Test{
	public void readFile()throws IOException{
		//定义方法时声明异常
				FileInputStream file=new FileInputStream("test.txt");
				int f;
				while((f=file.read())!=-1){
					System.out.println((char)f);
					f=file.read();
				}
				file.close();
			}

	public static void main(String[] args)  {
		Test t=new Test();
		try{
			t.readFile();//调用readFile方法
		}catch(Exception e){
			System.out.println(e);//捕获异常
		}
	}
}

以上代码,首先在定义 readFile() 方法时用 throws 关键字声明在该方法中可能产生的异常,然后在 main() 方法中调用 readFile() 方法,并使用 catch 语句捕获产生的异常。

方法重写时声明抛出异常的限制
使用 throws 声明抛出异常时有一个限制,是方法重写中的一条规则:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。看如下程序。
使用 throws 声明抛出异常时有一个限制,是方法重写中的一条规则:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。看如下程序。

public class OverrideThrows {
    public void test() throws IOException {
        FileInputStream fis = new FileInputStream("a.txt");
    }
}
class Sub extends OverrideThrows {
    // 子类方法声明抛出了比父类方法更大的异常
    // 所以下面方法出错
    public void test() throws Exception {
    }
}

上面程序中 Sub 子类中的 test() 方法声明抛出 Exception,该 Exception 是其父类声明抛出异常 IOException 类的父类,这将导致程序无法通过编译。

所以在编写类继承代码时要注意,子类在重写父类带 throws 子句的方法时,子类方法声明中的 throws 子句不能出现父类对应方法的 throws 子句中没有的异常类型,因此 throws 子句可以限制子类的行为。也就是说,子类方法拋出的异常不能超过父类定义的范围。

throw 拋出异常

与 throws 不同的是,throw 语句用来直接拋出一个异常,后接一个可拋出的异常类对象,其语法格式如下:

throw ExceptionObject;

其中,ExceptionObject 必须是 Throwable 类或其子类的对象。如果是自定义异常类,也必须是 Throwable 的直接或间接子类。例如,以下语句在编译时将会产生语法错误:

throw new String("拋出异常");    // String类不是Throwable类的子类

当 throw 语句执行时,它后面的语句将不执行,此时程序转向调用者程序,寻找与之相匹配的 catch 语句,执行相应的异常处理程序。如果没有找到相匹配的 catch 语句,则再转向上一层的调用程序。这样逐层向上,直到最外层的异常处理程序终止程序并打印出调用栈情况。

throw 关键字不会单独使用,它的使用完全符合异常的处理机制,但是,一般来讲用户都在避免异常的产生,所以不会手工抛出一个新的异常类的实例,而往往会抛出程序中已经产生的异常类的实例。

例 2
在某仓库管理系统中,要求管理员的用户名需要由 8 位以上的字母或者数字组成,不能含有其他的字符。当长度在 8 位以下时拋出异常,并显示异常信息;当字符含有非字母或者数字时,同样拋出异常,显示异常信息。代码如下:

import java.util.Scanner;
public class Test {
    public boolean validateUserName(String username) {
        boolean con = false;
        if (username.length() > 8) {
            // 判断用户名长度是否大于8位
            for (int i = 0; i < username.length(); i++) {
                char ch = username.charAt(i); // 获取每一位字符
                if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
                    con = true;
                } else {
                    con = false;
                    throw new IllegalArgumentException("用户名只能由字母和数字组成!");
                }
            }
        } else {
            throw new IllegalArgumentException("用户名长度必须大于 8 位!");
        }
        return con;
    }
    public static void main(String[] args) {
        Test05 te = new Test05();
        Scanner input = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = input.next();
        try {
            boolean con = te.validateUserName(username);
            if (con) {
                System.out.println("用户名输入正确!");
            }
        } catch (IllegalArgumentException e) {
            System.out.println(e);
        }
    }
}

如上述代码,在 validateUserName() 方法中两处拋出了 IllegalArgumentException 异常,即当用户名字符含有非字母或者数字以及长度不够 8 位时。在 main() 方法中,调用了 validateUserName() 方法,并使用 catch 语句捕获该方法可能拋出的异常。

运行程序,当用户输入的用户名包含非字母或者数字的字符时,程序输出异常信息,如下所示。

请输入用户名:
ligulasizhaosi!!!!!!
java.lang.IllegalArgumentException: 用户名只能由字母和数字组成!

当用户输入的用户名长度不够 8 位时,程序同样会输出异常信息,如下所示。

请输入用户名:
admin
java.lang.IllegalArgumentException: 用户名长度必须大于 8 位!

throws 关键字和 throw 关键字在使用上的几点区别如下:

  • throws 用来声明一个方法可能抛出的所有异常信息,表示出现异常的一种可能性,但并不一定会发生这些异常;throw
    则是指拋出的一个具体的异常类型,执行 throw 则一定抛出了某种异常对象。
  • 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw
    声明一个具体的异常信息。
  • throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw
    则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1.10 throws和throw:声明和抛出异常 的相关文章

  • vue的v-for循环中图片加载路径问题

    vue的v for循环中图片加载路径问题 产品要求 要求图片和它的名字一一对应 vue中的img的src可以动态绑定到一个变量上
  • 个数是如何用大数据做行为预测的?

    个数 是 个推 旗下面向 APP 开发者提供数据统计分析的产品 个数 通过可视化埋点技术及大数据分析能力从用户属性 渠道质量 行业对比等维度对 APP 进行全面的统计分析 个数 不仅可以及时统计用户的活跃 新增等 还可以分析卸载用户的成分
  • 【网安神器篇】——searchsploit漏洞利用搜索工具

    作者名 Demo不是emo 主页面链接 主页传送门 创作初心 一切为了她座右铭 不要让时代的悲哀成为你的悲哀专研方向 网络安全 数据结构 每日emo 我最常欺骗的人其实是我自己 通过一些技术手段 掌握到一些软件的版本信息应该如何利用呢 举个
  • oh-my-zsh 为 ls 命令自定义颜色

    ls 命令默认显示的颜色是 白色 表示普通文件 蓝色 表示目录 绿色 表示可执行文件 红色 表示压缩文件 蓝绿色 链接文件 红色闪烁 表示链接的文件有问题 黄色 表示设备文件 灰色 表示其他文件 在 oh my zsh 主题下如何自定义这些
  • CodeGeeX - 免费的AI编程助手

    1 官网 CodeGeeX 官网 2 VSCode安装CodeGeeX CodeGeeX 扩展 3 普通模式 无需付费 无需登录 下载就用 运行结果 4 拆分视图模式 快捷键Ctrl Enter触发拆分视图显示模式 5 生成注释模式 支持J
  • [经典论文分享] Attention, Learn to Solve Routing Problems!

    1 背景 自从有人基于指针网络解决组合优化问题以来 基于ML的组合优化问题求解模型逐渐被关注 基于深度强化学习的组合优化求解带来了较高的模型准确度和泛化性 但是目前基于DRL的CO求解准确度和训练效率一般 简单来说就是模型不是很成熟 针对模
  • 科技云报道:软件供应链安全如此重要,但为什么难以解决?

    科技云报道原创 软件供应链安全如今已经成了一个世界性难题 从2021年底Apache Log4j 核弹级 风险爆发 时至今日影响仍然存在 保障软件供应链安全已成为业界关注焦点 但近2年时间过去了 软件供应链安全问题似乎并没有得以缓解 安全事
  • 发送ARP数据包

    发送ARP数据包 ARP 地址解析协议 即ARP Address Resolution Protocol 是根据IP地址获取物理地址的一个TCP IP协议 主机发 送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机 并接收返回消息
  • 服务器虚拟化技术

    一 服务器虚拟化概述 1 服务器虚拟化简介 在一台物理服务器上运行多个虚拟服务器称为 服务器虚拟化 在服务器虚拟化中 专用虚拟化软件将物理服务器上的处理器存储器之类的资源划分为多个资源 并将其分配给虚拟服务器 由于可以在一台物理服务器上聚合
  • Python爬虫 XPath解析出乱码 解决方法

    请求后加上编码 resp requests get url headers headers resp encoding GBK
  • Springboot操作Elasticsearch——聚合分组与排序

    这两天项目中需要从es中查询数据 根据某个字段进行分组 求其最大 最小 平均值 并按最大值进行排序 springboot的版本号 2 0 6 RELEASE Elasticsearch的版本号 5 6 3 主要代码记录下 BoolQuery
  • 拆解开源项目Blender

    计划把Blender项目拆解出来 如果把Blender项目比作一辆汽车 那拆解的任务就是把它的发动机 轮胎 支架等不同的模块单独出来并能独自运行 不知道以前有没有人这样干过 在其他项目上 这样拆解的好处是可以更好地研究它的工作原理 并将这些
  • AFNetWorking出现code=-1016错误解决办法

    AFNetWorking的JSON解析默认库是使用的AFJSONRequestOperation模式 只支持text json application json text javascript 所以如果出现code 1016错误则说明当前的
  • 告别2021,迎接2022

    2021相对有点忙有点累 一直想记录一下 但是实在是在惰性趋势下 歇息了一个月 才正常提笔微记 最近思绪也比较忙 提笔规划也是有点凌乱 2021年在新单位的第二年 开始结交朋友 受朋友们的影响 开始准备考研 软考 幸运的是 也都坚持下来了
  • adb将Apk内置到系统中(system/priv-app)

    有时候我们在Android 系统内置自己的应用 在测试时 Android Studio 默认的安装方式是将我们开发的应用作为普通应用安装到系统中的 本文提供一种方式 在开发过程中 将apk内置到系统中 而不需要系统源代码 adb 将apk内
  • java新建一个窗口_Java实例:使用JFram创建一个简单的窗口

    一个图形用户界面以一个top level container开始 它为其他的界面组件提供了一个 家 指定应用程序的总体感觉 在本教程中 向你介绍JFrame类 它将用于给一个Java应用程序创建一个简单的top level窗口 打开你的编辑
  • UI操作 解决方案

    1 include
  • 中断、信号、系统调用

    1 中断的分类 中断程序的方法可以分为硬件中断和软件中断 硬件中断是硬件自动触发的 包括中断和异常 比如 中断 通过中断控制器给CPU的INTR引脚发送信号 如按下键盘 会给CPU一个0x21中断号 异常 CPU执行某条指令发生异常 会自己
  • tr td分合并单元格

    table border 1 width 200 tr td ss td tr tr td width 25 td td width 25 td tr table

随机推荐

  • Spark性能优化:数据倾斜调优

    前言 继 Spark性能优化 开发调优篇 和 Spark性能优化 资源调优篇 讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后 本文作为 Spark性能优化指南 的高级篇 将深入分析数据倾斜调优与shuffle调优 以解决更加
  • 设计补偿器网络以改善开关频率响应

    直流开关电压转换器 或 开关调节器 控制回路的特点是频率响应 频率响应影响开关调节器的反应时间对瞬态变化 精度和稳定性的影响 并在输入电压 负载和工作周期变化的情况下 如何保持设定的电压输出 工程师可以通过增加补偿器网络来改善开关调节器的频
  • Linux在云服务器上安装JDK

    官网地址下载 Java Downloads Oracle 将下载好的jdk通过Xftp传输到服务器上去 创建一个文件夹用于区分 在home文件夹下创建一个属于自己的文件夹 将需要的文件传输过去 也可以直接在 usr local 下配置 cd
  • win7电脑最新版微信卡死问题的解决

    最近一段时间无论单位还是家里事情都比较多 导致没有时间学习和写文 排名蹭蹭地往下掉 刚好遇到一个win7版微信卡死的问题 在网上查了下 找到了win10相关的可以参考的解决办法 确实有效 在此介绍一下 一 问题现象 当最小化win7托盘的微
  • linux环境安装php fileinfo扩展

    linux环境安装php fileinfo扩展 windows环境安装扩展比较简单 只需要把dll拷贝到扩展目录 修改php ini中相应的扩展就好了 下面来介绍一下linux环境下的php扩展安装 以centos6 5和php7 1为例
  • C++ OpenCV制作九宫格拼图游戏

    学更好的别人 做更好的自己 微卡智享 本文长度为2498字 预计阅读7分钟 前言 上一篇 C OpenCV生成九宫格图像 介绍了如何将图片分割城九宫格 然后重新打乱了顺序显示出来 本篇就来说一下怎么制作一个九宫格的拼图游戏 项目的重新创建了
  • JAVA是什么意思

    JAVA的意思是计算机的编程语言 Java通过面向对象的编程语言 它不仅吸收了C 语言的优点 而且摒弃了C 中难于理解的多继承和指针的概念 具有简单性 功能强大 分布式 健壮性 安全性 平台独立与可移植性 多线程及动态性的特点 Java语言
  • 第二十一课,几何着色器(基础篇)

    几何着色器的作用 输入 输入类型 从顶点着色器接收下列任何一个图元值 类型 数组大小 points 绘制GL POINTS图元时 1 lines 绘制GL LINES或GL LINE STRIP时 2 lines adjacency GL
  • seaborn学习笔记(二):散点图、线图

    html font family sans serif ms text size adjust 100 webkit text size adjust 100 body margin 0 article aside details figc
  • Spring Cloud Gateway替代zuul作为API网关(一)

    本文简要介绍如何使用Spring Cloud Gateway 作为API 网关 不是使用zuul作为网关 关于Spring Cloud Gateway和zuul的性能比较本文不再赘述 基本可以肯定Spring Cloud Finchley版
  • matlab 中.*和*有什么区别

    和 的区别 在进行数之间的运算时 和 是没有区别的 都是表示普通的乘法运算 例 m 2 n 3 m n 6 m n 6 在进行矩阵之间的运算时 和 的意义就有所不同了 假设a b表示两个矩阵 a b表示矩阵a与矩阵b进行矩阵相乘 a b表示
  • 微软服务器dda,实战DDA硬件直通:Hyper-V虚拟机直通NVMe固态硬盘

    虚拟机可以把一台电脑模拟成许多台完整的系统 并在他们当中安装运行各自的操作系统和软件应用 在使用虚拟机的时候我们既可以利用NVMe固态硬盘的性能 同时承载多个虚拟机的读写请求 也可以让其中某个需要重负载读写的虚拟机独享它的性能 这时就需要用
  • VsCode搭建Windows C++ (MSVC)开发环境

    由于最近的学习需求 折腾起了vscode 毕竟是跨平台 对以后项目的拓展也很方便 至于为什么不用mingw tdm gcc一类 主要因为毕竟是Windows平台 使用自家的MSVC开发环境一来可以放心 少出BUG 二来能够增强Windows
  • kmeans算法原理以及实践操作

    原文 http www cnblogs com dudumiaomiao p 5839905 html kmeans算法原理以及实践操作 多种k值确定以及如何选取初始点方法 kmeans一般在数据分析前期使用 选取适当的k 将数据聚类后 然
  • springboot搭建文件预览解决方案,支持目前主流格式office文件,txt文件,png,jpg等图片以及压缩文件的在线预览功能

    应用场景及实现思路 应用场景 给定一个网址 输入网址后立即显示预览文件 实现思路 1 将文件下载到本地 存储到某个指定目录 2 进行文件转换 此处是重点 3 进行文件展示 实现过程 首先 搭建一个springboot项目 搭建完毕后项目结构
  • ovsdb <10> Ops-cli结合ovsdb部分流程及接口分析

    4 6Ops cli结合ovsdb部分流程及接口分析 Ops中对于ovsdb的应用主要是基于上述的ovsdb的简单用法上的一个扩展和函数封装 现在就其与之前不同的地方做补充说明并就各个函数的使用做相应的说明 根据前面的ovsdb的数据结构描
  • 素数表

    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 1
  • C#条码设计-CODE93

    由于最近一段时间在忙考试 一直也没有时间接着写 现在考完试了 慢慢将其他的编码规则发上来 希望对各位能有所帮助 今天要跟大家分享的CODE93编码规则 一 了解一下CODE93的发展 1 Code 93於1982年 基於code 39之上而
  • Ubuntu14.04 64位机上配置OpenCV3.4.2+OpenCV_Contrib3.4.2+Python3.4.3操作步骤

    Ubuntu 14 04 64位上默认安装了两个版本的python 一个是python2 7 6 另外一个是python3 4 3 这里使用OpenCV最新的稳定版本3 4 2在Ubuntu上安装python3 4 3支持OpenCV的操作
  • 1.10 throws和throw:声明和抛出异常

    Java 中的异常处理除了捕获异常和处理异常之外 还包括声明异常和拋出异常 实现声明和抛出异常的关键字非常相似 它们是 throws 和 throw 可以通过 throws 关键字在方法上声明该方法要拋出的异常 然后在方法内部通过 thro