Java throw和throws 关键字

在Java中,异常可以分为两种类型:

  • 未检查的异常:它们不是在编译时而是在运行时被检查,例如:ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException,Error类下的异常等。

  • 检查的异常:在编译时检查它们。例如IOException,InterruptedException等。

通常,我们不需要处理未经检查的异常。这是因为由于编程错误而发生了未经检查的异常。并且,纠正它们而不是处理它们是一个好习惯。

throws 关键字

我们在方法声明中使用throws关键字来声明其中可能发生的异常的类型。

其语法为:

accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 … {
  // code
}

从上面的语法可以看到,我们可以用throws来声明多个异常。

示例1:Java throws 关键字

import java.io.*;
class Main {
  public static void findFile() throws IOException {
    //可能产生IOException的代码
    File newFile=new File("test.txt");
    FileInputStream stream=new FileInputStream(newFile);
  }

  public static void main(String[] args) {
    try{
      findFile();
    } catch(IOException e){
      System.out.println(e);
    }
  }
}

输出结果

java.io.FileNotFoundException: test.txt (No such file or directory)

当我们运行这个程序时,如果文件test.txt不存在,FileInputStream将抛出一个继承IOException类的FileNotFoundException异常。

如果方法不处理异常,则必须在throws子句中指定该方法中可能发生的异常类型,以便调用堆栈中更高层的方法可以处理它们或使用throws关键字本身指定它们。

findFile()方法指定可以抛出IOException。  main()方法调用此方法并处理抛出的异常。

引发多个异常

这是我们如何使用throws关键字引发多个异常的方法。

import java.io.*;
class Main {
  public static void findFile() throws NullPointerException, IOException, InvalidClassException {
    
    // 可能产生NullPointerException的代码
    … … … 

    // 可能产生IOException的代码
    … … … 

    // 可能产生InvalidClassException的代码 
    … … … 
  }

  public static void main(String[] args) {
    try{
      findFile();
    } catch(IOException e1){
      System.out.println(e1.getMessage());
    } catch(InvalidClassException e2){
      System.out.println(e2.getMessage());
    }
  }
}

这里,findFile()方法指定它可以在其throws子句中抛出NullPointerException、IOException和InvalidClassException。

请注意,我们尚未处理NullPointerException。这是因为它是未经检查的异常。不必在throws子句中指定它并进行处理。

throws 关键字 与try...catch...finally

可能有几个方法会导致异常。为每种方法编写try...catch将是乏味的,并且代码将变得冗长且难以理解。

当您已检查了不希望在当前方法中捕获的异常(必须处理的异常)时,throws也很有用。

 throw关键字

throw关键字用于显式地抛出一个异常。

当引发异常时,程序执行的流程从try块转移到catch块。我们在方法中使用throw关键字。

其语法为:

throw throwableObject;

Throwable对象是Throwable类或Throwable类的子类的实例。

示例2:Java throw关键字

class Main {
  public static void divideByZero() {
    throw new ArithmeticException("试图除以0");
  }

  public static void main(String[] args) {
    divideByZero();
  }
}

输出结果

Exception in thread "main" java.lang.ArithmeticException: 试图除以0
    at Main.divideByZero(Main.java:3)
    at Main.main(Main.java:7)
exit status 1

在此示例中,我们明确抛出 ArithmeticException.

注意: ArithmeticException是未经检查的异常。通常没有必要处理未经检查的异常。

示例3:抛出检查异常

import java.io.*;
class Main {
  public static void findFile() throws IOException {
    throw new IOException("文件未找到");
  }

  public static void main(String[] args) {
    try {
      findFile();
      System.out.println("try块中的其余代码");
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }
}

输出结果

文件未找到

findFile()方法使用传递给其构造函数的消息抛出一个IOException。

注意,由于它是一个检查的异常,因此必须在throws子句中指定它。

调用findFile()方法的方法需要处理此异常,或者自己使用throws关键字指定它。

我们已经在main()方法中处理了此异常。引发异常时,程序执行的流程在try块之间转移到catch。因此,将跳过该try块中的其余代码,并执行该catch块中的语句。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wordpress 学习贴

安装问题 我的使用环境为docker环境,php、nginx、mysql分别处于3个容器中, 提示异常,打开debug模式,会发现 No such file or directory Warning: mysqli_real_connect(): (HY000/2002): No such file or directory 这个其实问题其…

Linux操作系统3-项目部署

手动部署 步骤 1.在idea中将文件项目进行打包 2.自定义一个文件目录,上传到Linux 3.使用 java -jar jar包名就可以进行运行 注意,如果需要启动该项目,需要确定所需的端口是否打开 采用这种方式,程序运行的时候会出现霸屏,并且会…

最近写了10篇Java技术博客【SQL和画图组件】

(1)Java获取SQL语句中的表名 (2)Java SQL 解析器实践 (3)Java SQL 格式化实践 (4)Java 画图 画图组件jgraphx项目整体介绍(一) 画图组件jgraphx项目导出…

计算机毕设 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉…

二阶段web基础与http协议

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层-----传输层-----网络层-----数据链路层-----物理层 ip地址,每一台主机都有一个唯一的地址标识(固定的ip地址) 1.区分用户和计算机 2.通信 ip地址的问题在于32位二进制数组成的&…

【安装vue脚手架报错:npm install -g @vue-cli pm ERR! code EINVALIDTAGNAME 】

当我们执行npm install -g vue-cli时候会报错: npm ERR! Invalid tag name “vue-cli” of package “vue-cli”: Tags may not have any characters that encodeURIComponent encodes. npm ERR! A complete log of this run can be found in: /Users/wuwenlu/.npm/…

Centos虚拟机修改密码

1.重启系统 2.在这个选择界面,按e 3.找到如下位置,插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密码…

React入门学习笔记1

前言 React是一个用来动态构0建用户界面的JavaScript库(只关注于视图)。它可以帮助开发人员轻松地创建复杂的交互式界面,以及管理与用户交互的状态。相比于其他的JavaScript框架,React采用了一种不同的编程模型,称为“…

【BASH】回顾与知识点梳理(二)

【BASH】回顾与知识点梳理 二 二. Shell 的变量功能2.1 什么是变量?2.2 变量的取用与设定: echo, 变量设定规则: set/unset2.3 环境变量的功能用 set 观察所有变量 (含环境变量与自定义变量)export: 自定义变量转成环境变量那如何将环境变量转成自定义变…

《向量数据库指南》——当前向量数据库的赛道有哪些?

当前,向量数据库赛道主要分为四个类别: 基于PG、Clickhouse 等进行魔改或者插件化实现的向量数据库:这类解决方案以现有的关系数据库或列存数据库作为基础,通过修改或插件扩展的方式添加向量搜索功能。PG Vector 是这类解决方案的…

【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍类图出场角色 案例实现案例一类图代码实现 案例二类图代码实现 外观模式在Mybatis源码中的应用总结文章说明 案例引入 在家庭影院中,要享受一场电影,需要如下步骤: 直接用遥控器:统筹各设备开关开…

Linux - 进程控制(进程替换)

0.引入 创建子进程的目的是什么? 就是为了让子进程帮我执行特定的任务 让子进程执行父进程的一部分代码 如果子进程想执行一个全新的程序代码呢? 那么就要使用 进程的程序替换 为什么要有程序替换? 也就是说子进程想执行一个全新的程序代码&a…

FSM:Full Surround Monodepth from Multiple Cameras

参考代码:None 介绍 深度估计任务作为基础环境感知任务,在基础上构建的3D感知才能更加准确,并且泛化能力更强。单目的自监督深度估计已经有MonoDepth、ManyDepth这些经典深度估计模型了,而这篇文章是对多目自监督深度估计进行探…

three.js实现vr全景图

方法: 可以利用Threejs中的立方体或者球体实现全景图功能,把立方体或球体当成天空盒子,将无缝衔接的图片贴上,看起来就像在一个场景中,相机一般放置在中央。 three.js中文网 1、立方体实现 立方体6个面要贴上6个方向的图片&…

Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…

html:去除input/textarea标签的拼写检查

默认情况下&#xff0c;textarea 会启动拼写和语法检查&#xff0c;表现效果就是单词拼写错误会出现红色下划线提示 <textarea></textarea>效果 有时&#xff0c;我们并不需要拼写检查&#xff0c;可以通过配置属性spellcheck"false" 去除拼写和语法检…

物联网远程智能控制设备——开关量/正反转百分比控制

如今生产生活的便利性极大程度上得益于控制技术的发展&#xff0c;它改变了传统的工作模式&#xff0c;并将人们从【纯劳力】中解放出来。如今&#xff0c;随着科学技术的进步&#xff0c;控制器的种类及应用领域也越来越多。 物联网远程智能控制设备就是一种新型的、能够用于…

抄写Linux源码(Day2:构建调试环境)

我们计划把操作系统运行在 qemu-system-x86_64 上&#xff0c;使用 gdb 调试 经过 RTFM&#xff0c;可以使用 qemu-system-x86_64 -s -S 让 qemu 在启动之后停住 接着在另一个窗口运行 gdb&#xff0c;输入命令 target remote localhost:1234&#xff0c;即可连接qemu并调试运…

泛微oa 二次开发指南(ecology)

目录标题 一、环境搭建&#xff08;一&#xff09;先下载安装泛微oa&#xff08;ecology&#xff09;&#xff08;二&#xff09;idea环境搭建二、官方文档三、开发规范&#xff08;里面有入门案例&#xff09;四、三方系统调用oa系统接口五、oa系统所有接口文档六、ecology的一…

mysql事务日志

事务有4中特性&#xff1a;原子性&#xff0c;一致性&#xff0c;隔离性和持久性。那么事务的四种特性到底是基于什么机制实现的呢&#xff1f; 1. 事务的隔离性由 锁机制 实现。 2. 而事务的原子性&#xff0c;一致性和持久性由事务的redo日志和undo日志来保证的。 ~ redo l…