Java throws和throw

throws 声明异常

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

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

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

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

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

创建一个 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("read.txt"); // 创建 FileInputStream 实例对象int f;while ((f = file.read()) != -1) {System.out.println((char) f);f = file.read();}file.close();}public static void main(String[] args) {Throws t = new Test();try {t.readFile(); // 调用 readFHe()方法} catch (IOException e) {// 捕获异常System.out.println(e);}}
}

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

方法重写时声明抛出异常的限制
使用 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 关键字不会单独使用,它的使用完全符合异常的处理机制,但是,一般来讲用户都在避免异常的产生,所以不会手工抛出一个新的异常类的实例,而往往会抛出程序中已经产生的异常类的实例。

在某仓库管理系统中,要求管理员的用户名需要由 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) {Test te = new Test();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 语句捕获该方法可能拋出的异常。

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

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

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

请输入用户名:
admin
java.lang.IllegalArgumentException: 用户名长度必须大于 8 位!
throws 关键字和 throw 关键字在使用上的几点区别如下:

1 . throws 用来声明一个方法可能抛出的所有异常信息,表示出现异常的一种可能性,但并不一定会发生这些异常;throw 则是指拋出的一个具体的异常类型,执行 throw 则一定抛出了某种异常对象。

2 . 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。

3 . throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。

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

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

相关文章

html 怎么让tr的css覆盖td的_通达OA上传漏洞之变量覆盖分析

作者&#xff1a;kw0ng开始通达OA上传到包含漏洞分析的文章已经有很多&#xff0c;本文重点分析&#xff0c;文件上传处决定路径信息是否回显的UPLOAD_MODE参数是怎么传递的。代码分析触发文件上传点位于/ispirit/im/upload.php中&#xff0c;服务端在接收文件信息的同时还需要…

怎么看电脑的hdmi是输出还是输入_高清hdmi矩阵切换器4进4出音视频方案介绍景阳华泰科技...

高清hdmi矩阵切换器4进4出多少钱&#xff1f;这就需要了解您需要哪种4进4出矩阵&#xff01;景阳华泰科技生产的矩阵分为两种形式&#xff0c;一种是我们近几十年来一直使用的一体机&#xff0c;高清HDMI矩阵切换器4进4出采用一体机结构&#xff0c;经济实惠&#xff0c;功能较…

专业音频如何把电平转换成dbu_谭俊峰|录课、买麦,你应该了解的音频常识

近来&#xff0c;有打算录录课、吹吹牛&#xff0c;于是想升级一下硬件。既然要录音&#xff0c;那搞个好一点儿的麦克风总是必要的。于是&#xff0c;上网去查。不查不知道&#xff0c;一查吓一跳。为啥呢&#xff1f;既不为产品的琳琅满目&#xff0c;也不为价格的云泥之别&a…

android 自定义进度条_第一百八十九回:Android中自定义ProgressBar三

各位看官们大家好&#xff0c;上一回中咱们说的是Android中自定义ProgressBar的例子&#xff0c;这一回咱们继续说该例子。闲话休提&#xff0c;言归正转。让我们一起Talk Android吧&#xff01;看官们&#xff0c;我们在上一回是通过自定义PrgressBar的方式给它添加了文字&…

Java信息验证

某仓库管理系统的登录界面中需要输入用户名和密码&#xff0c;其中用户名只能由 6~10 位数字组成&#xff0c;密码只能有 6 位&#xff0c;任何不符合用户名或者密码要求的情况都视为异常&#xff0c;并且需要捕获并处理该异常。 下面使用自定义异常类来完成对用户登录信息的验…

沉降观测曲线图 沉降观测汇总_这些沉降观测要求,工程人必须掌握!

1沉降观测的基本要求 1)仪器设备、人员素质的要求根据沉降观测精度要求高的特点&#xff0c;为能精确地反映出建(构)筑物在不断加荷下的沉降情况&#xff0c;一般规定测量的误差应小于变形值的1/10—1/20&#xff0c;为此要求沉降观测应使用精密水准仪(S1或S05级)&#xff0c;水…

rgb红色范围_【论文阅读18】RGB-D Object-Oriented Semantic Mapping

主要内容基于RGB-D数据的语义建图&#xff08;SLAM帮助语义&#xff09;。具体过程如下首先利用SSD执行单帧RGB图片&#xff08;2D&#xff09;物体检测。接着基于检测结果和深度信息&#xff0c;利用3D分割算法进一步分割3D点云。最终利用ORB-SLAM2的相机位姿信息将每帧的3D点…

Java的异常跟踪栈

异常对象的 printStackTrace() 方法用于打印异常的跟踪栈信息&#xff0c;根据 printStackTrace() 方法的输出结果&#xff0c;开发者可以找到异常的源头&#xff0c;并跟踪到异常一路触发的过程。 看下面用于测试 printStackTrace 的例子程序。 class SelfException extends…

7价 半导体掺杂_掺杂工艺(一)

概述半导体材料的独特性质之一是它们的导电性和导电类型(N型或P型)能被产生和控制。在本章中&#xff0c;描述在晶圆内和表面上特别的小块导电区和PN结的形成。介绍扩散和离子注入两种掺杂技术的原理和工艺。简介使晶体管和二极管工作的结构就是PN结。结(junction)就是富含电子…

数据增强_imgaug图像数据增强必备工具

导读我们经常会遇到训练模型时数据不够的情况&#xff0c;而且很多时候无法再收集到更多的数据&#xff0c;只能通过做一些数据增强或者其它的方法来合成一些数据。常用的数据增强方式有裁剪、旋转、缩放、亮度对比度色度饱和度变换、仿射变换、透视变换等&#xff0c;这篇文章…

Java类的封装

封装将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;只能通过该类提供的方法来实现对隐藏信息的操作和访问。 封装的特点&#xff1a; 只能通过规定的方法访问数据。隐藏类的实例细节&#xff0c;方便修改和实现。实现封装的具体步骤如下&#xff…

python 公众号菜单_Python脚本--微信公众号自定义菜单的创建及获取

#-*- coding: utf-8 -* importtkMessageBoximporturllib2importjsonimportsys reload(sys) sys.setdefaultencoding(UTF-8) appID wxa46e26b3d591f9f2 //测试号信息 appsecret 83ee70dbb6dbc1e090971554b1c7981b //同上 menu { //菜单信息&#xff0c;包括一级菜单和二级菜单&q…

深度学习多模态融合_3D目标检测多模态融合综述

0前言本篇文章主要想对目前处于探索阶段的3D目标检测中多模态融合的方法做一个简单的综述&#xff0c;主要内容为对目前几篇几篇研究工作的总结和对这个研究方面的一些思考。在前面的一些文章中&#xff0c;笔者已经介绍到了多模态融合的含义是将多种传感器数据融合。在3D目标检…

Java封装图书信息类

封装示例编写表示图书的 Book 类&#xff0c;实现以下需求&#xff1a; 基本信息包括图书名称&#xff08;bookName&#xff09;、总页数&#xff08;pagelbtalNum&#xff09;&#xff0c;其中页数不能少于 200 页&#xff0c;否则输出错误信息&#xff0c;并赋予默认值 200。…

python tkinter数据库通讯录_TKINTER--GUI连接数据库登陆

#-*- coding:UTF-8 -*- import tkinter.messagebox import tkinter as tk import pymysql # 构造窗口 window tk.Tk() window.title(登陆窗口) window.geometry(450x300) # 构造画布 canvas tk.Canvas(window,height200,width500) image_file tk.PhotoImage(filewelcome.gif…

自适应宽_移动端实现自适应缩放界面的方法汇总

作者 | 唐宋元明清2188来源 | http://www.cnblogs.com/kybs0/在开发App端的网页时&#xff0c;要适配iphone、ipad、ipod、安卓等各种机型&#xff0c;一般是直接使用em、px转em、界面缩放。本章是通过将界面缩放&#xff0c;等比例显示在各机型上。过程中遇到了些问题和大坑~然…

Java继承简介

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性&#xff0c;从而减少代码冗余&#xff0c;提高程序运行效率。 Java 中的继承就是在已经存在类的基础上进行扩展&#xff0c;从而产生新的类。已经存在的类称为父类、基类或超类&…

各种说明方法的答题格式_初中语文阅读答题公式 语文阅读理解万能公式大全...

很多人想知道初中语文阅读理解有哪些答题公式&#xff0c;语文阅读理解的万能公式有哪些呢?下面小编为大家介绍一下!初中语文阅读理解答题公式大全(一)某句话在文中的作用&#xff1a;1、文首&#xff1a;开篇点题;渲染气氛(散文)&#xff0c;埋下伏笔(记叙类文章)&#xff0c…

esp8266手机端网络调试助手_esp8266定时控制

要实现定时控制&#xff0c;需要先实现手动控制&#xff0c;或者app控制。实测定时精度&#xff0c;北京时间&#xff0c;误差不超过1秒。第一、远程App控制或手动控制下载esp8266示例程序下载地址: 点击下载本demo 是利用arduino IDE开发&#xff0c;关于arduino IDE 的ESP826…

集成学习之Adaboost(提升方法)

Adaboost 提升方法就是从弱学习器出发&#xff0c;反复学习&#xff0c;得到一系列弱分类器&#xff08;基本分类器&#xff09;&#xff0c;然后组合这些弱分类器&#xff0c;构成一个强分类器。 基本思路 待解决问题 1、每一轮如何改变训练数据的权值或概率分布 2、如何将…