【Java·异常处理语句】throws/throw、try...catch、finally

[原创]Step by step 实现自己的AI知识库问答(二) 对小白很友好的AI智能问答开发保姆级教程,适合初级开发者、学生阅读参考,无限制分享,欢迎转载。在这个章节中,我们使用了百度千帆作为知识库,通过简单的代码调用API实现了智能问答。 阅读详情

1、写在前面

今天文章的内容是:

异常处理

2、内容

2.1、异常方法

Throwable类的主要方法如下所示.

public void printStackTrace():

该方法将此Throwable及其回溯打印到标准错误流,打印该对象的堆栈跟踪。输出内容中的第一行包含此对象的toString()方法的结果。剩余行表示先前由方法fillInStackTrace()记录的数据。

public String toString()

该方法返回此throwable的简短描述,即printStackTrace()方法调用后输出内容中的第一行。

public Throwable getCause()

该方法返回一个Throwable对象代表异常原因。如果原因不存在或未知,则返回此throwable或null的原因。

public String getMessage()

该方法返回关于发生的异常的详细信息字符串(也可能是null),该字符串在Throwable类的构造函数中初始化了。

public StackTraceElement [] getStackTrace()

该方法返回堆栈跟踪元素的数组,每个元素代表一个堆栈帧。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。

public Throwable fillInStackTrace()

该方法在此Throwable对象中记录有关当前线程的堆栈帧的当前状态的信息。即用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。

2.2、throws

异常的处理方式之一就是使用throws关键字来抛出异常。
语法如下:

方法 throws 异常1, 异常2, ... {

}

有时抛出的异常比较多,我们会这样做:

方法 throws Exception {

}

综上所述,throws关键字用在方法上,可以将方法内部出现的异常抛给方法调用处。但注意,这种异常处理方式其实并不好,发生异常的方法自己不处理,最终抛出去的异常会由虚拟机接受,最终程序会终止退出。

throw跟throws的区别:

public void test() throws Exception {
    throw new Exception();
}

在上面这段代码中可以看出:

throws表示方法声明可能抛出一个异常
throw表示此处抛出一个已定义的异常(可以是自定义异常、也可以是Java异常类)

2.3、try...catch

除了抛出异常外,我们还可以用try...catch方式在方法内部进行监视代码try,如果出现异常就捕获catch。
语法规则如下:
我们将可能发生异常的代码放在try语句块中,如果try语句块中发生异常,那么一个相应的异常对象就会被拋出(此时try语句块中剩余的语句会被忽略),异常对象抛出后会被catch捕获并处理,catch后的括号()用于存放匹配的异常类的实例,用于接收异常对象,在catch语句块中就可编写异常处理语句(比如调用异常对象的相关方法)。
另外,如果try语句块中没有发生异常,那么try语句块正常运行后会跳过catch语句块,此时程序将从catch语句块后的第一条语句开始执行。
代码如下:

try {
    // 编写可能出现异常的代码...
} catch (异常类 变量名) {
    // 异常处理
}

另外,如果try语句块中可能产生多个异常,那么try语句块后可跟多个catch代码块,如下所示:

try {
    // 编写可能出现异常的代码...
} catch (异常类1 变量名) {
    // 异常处理
} catch (异常类2 变量名) {
    // 异常处理
}
...

有时我们也会这么写:

try {
    // 编写可能出现异常的代码...
} catch (Exception e) {     // Exception可以用于捕获一切异常类型
    e.printStackTrace();    // 打印异常栈信息
}

综上所述,try...catch方式使得发生异常的部分可以自己独立完成异常的处理,程序仍可以往下执行。
备注:

当捕获的多个异常类之间存在父子关系(继承关系)时,捕获异常时一般先捕获子类,再捕获父类。所以子类异常必须写在父类异常的前面,否则子类捕获不到。
try...catch后面的花括号{ }不可以省略(即使语句块中只有一行代码),这与if...else语句可以省略花括号不一样。
try语句块里声明的变量属于局部变量(这些局部变量只在try块内有效)

举个例子:

我们编写一个程序,要求用户输入一个合法价格,然后输出打折后的价格。
这里如果用户输入的价格低于0,则提醒用户输入的价格必须为正数。
如果用户输入的价格不是合法数值,则提醒用户输入价格的格式有误。

代码如下:

import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            try {
                System.out.println("请输入正确的价格(按0退出):");
                String priceStr = sc.nextLine();
                double price = Double.valueOf(priceStr);
                if(price > 0) {
                    System.out.println("打折后价格为:" + price*0.75);
                    System.out.println("=====");
                }else if(price == 0) {
                    System.out.println("程序正在退出...");
                    break;
                }else {
                    System.out.println("请输入正数!");
                    System.out.println("=====");
                }
            }catch (Exception e) {
                System.out.println("您输入的数值格式不正确!");
                System.out.println("=====");
            }
        }
    }
}

运行后的结果可以是:

请输入正确的价格(按0退出):
666
打折后价格为:499.5
=====
请输入正确的价格(按0退出):
-100
请输入正数!
=====
请输入正确的价格(按0退出):
abc
您输入的数值格式不正确!
=====
请输入正确的价格(按0退出):
0
程序正在退出...

Process finished with exit code 0

2.4、finally

finally关键字用于创建在try代码块后面执行的代码块。其特点是,无论是否有异常发生,finally代码块中的代码总会被执行。
语法如下:

try {
  // 可能发生异常的代码
  // ...
} catch(异常类1 变量1) {
  // 异常处理模块1
  // ...
} catch(异常类2 变量2) {
  // 异常处理模块2
  // ...
} finally{
  // 具有收尾善后性质的语句
  // ...
}

注意事项:

finally语句块并不是强制要求的;
程序会先执行catch里面的代码,接着执行finally里面的代码,最后才执行catch块中的return语句。
如果finally块中有return语句,则catch块中的return语句则不会被执行到

企业微信API实战:解密external_userid的跨应用一致性管理 本文深入探讨企业微信API中external_userid的跨应用一致性管理问题,解析其本质及在不同应用场景下的ID不一致挑战。通过ID转换与统一管理方案,结合unionid实现跨应用客户数据整合,提供实战代码示例和架构设计,助力企业构建高效的客户管理系统。 阅读详情

相关推荐

代码实现ROS2bag录制数据和回放数据(C++)

ROS2的ROS2bag功能可以将指定Topic中的数据以.db3的格式(不同于ROS)保存到本地文件中。读取文件数据可以实现数据回放。

m0_57124501的博客 3257

try catch finally throw 执行顺序

try catch finally throw 执行顺序

weixin_41126214的博客 870

Linux USB设备命名规则

有一个USB设备,接到了Linux系统的终端的某个插口上,那么怎么找到这个设备对应设备路径呢?这个USB设备虚拟了多个功能(三个串口和一个网卡), 如何找到对应操作路径呢?

weixin_43132521的博客 1699

在catch中使用throw,finally中的语句是否会执行?

public class Exceptiontest{   public static void main(String[] args) throws Exception   {    try{     System.out.println("zai try中");    }catch(Exception e){     System.out.println("zai catch中");     ...

happ1213的博客 3967

介绍七种常见还危险的病毒(带样本)

简介:能够感染用户计算机bai系统中的.exe、.dll和.html文件,将自身加密以后缀加到目标文件中。样本(源文件):https://wwx.lanzoux.com/iJx4njrpz1c / https://wwx.lanzoui.com/iYRNLwd8ldc。英文名称:Virus.Win32.Viking.A(标准) / Worm.Win32.Fujack.A(标准)英文名称:Net-Worm.Win32.Blaster.A(标准)/ Lovesan.A/ Msblast.A。

2301_78858007的博客 8490

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4169

java之Try-catch-finally的执行顺序以及程序何时终止

Try-catch-finally的执行顺序以及程序何时终止 文章目录Try-catch-finally的执行顺序以及程序何时终止异常的分类不对异常进行处理对于运行时异常进行try-catchthrows的运行时异常需要进行try-catch手动抛出异常程序终止catch块抛出异常finally块还会执行finally块中有return不会执行catch块中的手动抛出异常try-catch-finally块同时存在return 异常的分类 异常分为运行时异常和非运行时异常(IOException,SQLEx

weixin_48412846的博客 2826

三极管自激升压电路设计 - 从参数计算到实践验证

本文详细解析了三极管自激升压电路(焦耳小偷电路)的设计原理与实践方法。通过剖析自激振荡机制与三极管电流关系,指导读者完成从核心参数计算、关键元件选型到面包板搭建调试的全过程。文章重点阐述了如何利用电感、三极管等基础元件实现低压直流到高压的转换,是理解开关电源与电磁能量转换的绝佳实践项目。

weixin_29250573的博客 371

Java异常

简单解释

weixin_45931856的博客 2591

第4章 本地一键部署(新手首选)

本文介绍了OpenClaw的本地部署方法,特别适合新手用户。部署过程仅需执行一条命令,通过自动脚本完成安装和配置向导。安装完成后,用户可通过终端TUI或Web控制面板验证部署是否成功。文章还提供了常见问题的排查方法,包括端口占用、权限不足、APIKey无效和安装卡顿等情况。整个部署流程简单直观,无需手动修改配置文件,适合快速搭建使用。

eastyuxiao的专栏 195

在 MATLAB/Simulink 中构建一个卫星间激光通信链路的完整仿真系统

摘要: 本文通过Simulink详细演示了卫星间激光通信系统的建模过程,重点分析其在10Gbps高速率、2000km距离下的性能。系统设计涵盖PAM-4调制、自由空间信道建模(路径损耗、指向误差、多普勒效应)、APD探测及链路预算计算,并给出典型场景下18.5dB SNR、1e-9误码率的仿真结果。针对激光通信的μrad级指向精度挑战,提出AI辅助跟踪、混合RF/激光等优化策略,为未来太空高速组网提供可扩展的仿真框架。所需工具箱包括Communications Toolbox和Aerospace Toolb

xiaoheshang_123的博客 384

Java中的异常处理:try-catch语句与throw/throws关键字

在程序中为什么要有异常处理呢? 首先程序很难做到完美,会存在各种bug,为了解决这些异常,我们需要知道知道异常发生的原因; 当程序运行发生错误的时候,就会抛出异常,这时我们可以设置一个捕捉异常的“处理器”对异常情况进行监视处理; 异常类型分为未检查异常和已检查异常,对于已检查异常,编译器会检查是否设置了处理器; 但是未检查异常,需要我们设置“处理器”以便使程序更好地运行; 例如试图打开一个不存在的...

qq_41027127的博客 3618

RK3568平台(电源篇)电源域IO配置

在kernel之前需要修改电源域,主控电源域的IO电平要与对接外设芯片的IO电平匹配,还要注意软件的电压配置要跟硬件的电压一致,否则,最坏的情况可能会导致IO的损坏。其实就是管理 IO 输出的电平;假如硬件上 IO 电源域配置为 3.3V,则 IO 输出最大电平为 3.3V;同理 IO 电源域硬件配置为 1.8V,则 IO 输出最大电平是 1.8V;这样有利于 IO 电平的灵活配置;

weixin_49303682的博客 3480

Java基础-异常处理机制 及异常处理的五个关键字:try/catch/finally/throw /throws

Java基础-异常处理机制 及异常处理的五个关键字:try/catch/finally/throw /throws

weixinhmz的博客 412

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

throw throws try catch finally return

throw throw 语句用于抛出异常,例如 throw new EOFException()。 throws 当使用throw 语句抛出checked 异常后,可以不用捕获异常并处理,而是使用throws 语句传递异常给本方法的调用者,调用者根据自身情况对异常进行捕获或者继续传递异常给它的调用者,如下: public void read () throws IOExce...

weixin_30514745的博客 114

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

30、Java中的异常(Exception)

自定义异常是开发者根据特定需求创建的异常类,它们通常继承自 Java 的 Exception 类或 RuntimeException 类。自定义异常使得异常处理更加灵活和具体,能够更好地描述程序中可能出现的错误情况。若定义受检查的异常(Checked Exception),则继承自 Exception 类;若定义运行时异常(Runtime Exception),则继承自 RuntimeException 类;自定义的异常类,通常需提供如下构造方法:try {

2402_87701017的博客 2098

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

lab4 基础知识--java异常处理机制

java异常 处理机制简介 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。 常用关键字 try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。 catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。 finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接

weixin_43822313的博客 199

第 20 章 异常处理(随笔)

1.异常介绍Java所有的异常类是从 java.lang.Exception 类继承的子类。异常类的继承关系如下图:Exception 类是 Throwable 类的子类,除了Exception类外,Throwable还有一个子类Error。Java 程序通常不捕获错误,错误一般发生在严重故障时,它们在Java程序处理的范畴之外。Error 用来指示运行时环境发生的错误,异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。例如,JVM 内存溢出、线程死锁、虚拟机错误。

weixin_50615803的博客 145

Java 基础知识(3)(抽象类/IO/异常)

1 抽象类 抽象: 实际存在的,具体的现实生活中的事务叫做对象,而抽象就是将他们的共有信息提取出来做一个描述。比如说:“猫” 是一个对象,具体存在。“ 动物”,”宠物“等等就是猫可以抽象出来的东西,而抽象出来的东西又可以代表一个部分,你可以理解抽象出来的东西,但是不能用来具体对应上现实存在的事物。 1.1抽象类与普通类 (1) 抽象不是具体的概念,抽象类不能被实例化,而普通类可以进行实例化调用。...

liutaiyi8的博客 233

异常(Exception)

异常(Exception) Error 一般是灾难性的致命的错误,是程序没办法处理的,java虚拟机(JVM)一般会终止线程。 Exception通常是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。 异常处理机制 抛出异常和捕获异常。 异常处理的五个关键字:try,catch,finally,throw,throws。 Throwable是所有异常的超类(父类)。 选中代码,快捷键ctrl+alt+t,快速生成try/catch语句。 ...

dazhaozhao6的博客 192

try、catch、finally中return的执行顺序及自定义异常创建

1.在Java中使用 try/catch语句捕获异常 说明 throw和throws的区别? 1.作用不同:throw用于程序员自行产生并抛出异常,throws用于声明该方法内抛出了异常。 2.使用的位置不同:throw位于方法体内部,可以作为单独语句使用。throws必须跟在方法参数列表的后面,不能单独使用。 3.内容不同:throw抛出一个异常对象,并且只能是一个。throws后面跟...

nameIsHG的博客 371

12. Java异常及异常处理

java异常,异常体系,常见Exception,异常处理,try finally catch关键字,throws和throw自定义异常,finally,final,finalize三者的区别,异常对象,异常处理的意义,异常超类,异常的两个子类,Exception的两类异常,常见UncheckedException异,常见RuntimeException异常,编译器的自动关闭特性,自定义异常

这个家伙看起来很懒,只想把你留下来哦 512

Java 中的异常处理

1、异常简介 ​ 我们在进行程序设计和运行过程中,发生错误是不可避免的。尽管Java语言的设计便于写出整洁、安全的代码,并且程序员也会尽量地去避免错误的发生。但错误的存在仍然不可避免,有时甚至会使程序被迫终止。为此,Java提供了异常处理机制来帮助程序员处理可能出现的错误,保证了程序的健壮性 2、异常的继承树 在 Java 中,所有的异常都有⼀个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的⼦类 Exception(异常)和 Error(错误)。

qq_43811879的博客 413

总结java异常处理体系

Java异常处理的标准流程Java语言中异常处理主要使用到try/catch/finally三种语句标准异常处理流程:抛出异常=>捕获异常=>捕获成功=>异常被处理,程序继续运行。抛出异常=>捕获异常=>捕获失败=>异常未被处理,程序不继续运行。try代码块 : 把所有可能抛出异常的,或者肯定抛出异常的代码都写到try代码块中catch语句:  catch语...

MLXX94的博客 270

Java中异常处理使用方法详解

非检查异常(Unchecked Exception):这类异常是在运行时出现的异常,即编写程序时不需要处理,但在程序运行过程中可能会发生。- 检查异常(Checked Exception):这类异常是在编译时进行检查的异常,也就是在编写程序时需要用try/catch语句处理或用throws关键字抛出的异常。- try/catch/finally语句:try块包含可能发生异常的代码,catch块用于捕获并处理异常,finally块用于释放资源,无论是否发生异常都会被执行。

weixin_63645714的博客 214

究竟什么是Java异常?

第四阶段 IO 异常处理 没有完美的程序,所以我们需要不断地完善,考虑各种可能性,我们要将除了自己以外的任何用户或者操作者都当成傻子来考虑问题 在我们开发过程中 我们运行时常常会遇到 这样java.lang.XxxException的信息,这代表程序发生了一些错误,也叫作异常 (一) 概述及体系 (1) 概述 异常情形是指阻止当前方法或者作用域继续执行的问题 ——《Think in Java》 简...

283
上一篇: SQL优化调优,就跟吃饭喝水一样简单,教你抓住SQL的本质
下一篇: 为型设计模式之访问者模式
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值