异常的两种处理方式--java进阶day08
1.异常的默认处理流程
java中,对于异常的默认处理方式是--向上抛出
之前我们说过,异常都是类,当某个程序出错后,就会自动生成该异常对象,而这个异常对象就如同一颗雷

.

java的异常默认处理方式--向上抛出,其中上,就是指上一级,调用该程序的那个逻辑
所以,在错误代码那一行生成了异常对象后,就会把异常向它的上一级抛出,也就是主方法

主方法拿到这颗雷后,继续向上抛出,将异常对象扔给JVM虚拟机(之前总是说虚拟机自动调用主方法)

虚拟机接收到这颗雷后,就将这颗雷扔给给了程序员,将错误的原因和信息展示后,就会强制停止程序

这套流程,我们需要记住两个点
第一个--异常代码会生成异常对象
第二个--java异常的默认处理方式:向上抛出
2.异常的第一种处理方式--try catch

如图,我们将可能出错的代码放入try的{}中,在catch{}里写入处理异常的代码,当程序出错时,就会走该逻辑

当代码出错时,产生异常对象,就会被catch给捕获,从而无法向上抛出,也就不会终止程序

当有多个异常时,我们可以写多个catch进行精准捕获
也可以直接在catch()里写Exception(父类异常),通过多态捕获大部分异常,但是这种捕获较于笼统

要注意,Exception必须写在最后面,否则其他的catch就没有意义了,因为那些异常都是它的子类都可以被Exception捕获

案例
键盘录入学生的姓名和年龄
先写好学生类,然后键盘录入姓名和年龄,在这里要注意的是,nextline和nextint会有冲突,所以我们换个方式录入年龄

先用nextline接收字符串,再用Integer里的parseint方法转换为整数类型

接着使用set方法,初始化学生的姓名和年龄,最后打印即可

写到这里还没有结束,因为代码中还存在错误,如下图

年龄输入abc,无法转换为整数,出现了异常,但我们不想暴露异常,可以使用try catch进行代码优化
将可能出现异常的代码包裹,然后catch{}里给出提示,并且使用死循环,直到用户输入正确的年龄后,再使用break结束

.

要注意,age如果定义在try{}里面,就会因为作用域而导致后面的set方法无法使用,所以系统将age定义在了外面
但其实这段代码还是没有完全优化,目前我们只是对年龄的格式进行了验证,但是对年龄的范围还没有处理,如图

不过先别着急,我们先学习异常的第二种处理方式后,再说该怎么优化这个代码
3.异常的第二种处理方式--throws

如图,我们正常创建时间格式化对象,并且调用里面的parse方法,程序会出现编译时异常

此时,有两种解决方法,第一种就是try catch捕获该异常,第二种就是throws声明该异常

throws关键字起声明的作用,旨在告诉我们,该代码可能存在异常,并且也没有处理异常,单单起声明作用
如果只起声明的作用,异常真的暴露了会怎么样呢?
--我们可以调用这个方法,看一下会出现什么

上图中method爆红,因为method方法已经加了throws,声明了这个方法可能有问题,所以问你要不要在主方法里进行处理,我们依旧声明,不进行处理

.

很明显,当代码中确实存在问题并且不进行处理时,声明就只是声明,控制台还是展示错误信息并且终止程序
4.try catch和throws的使用场景

假设我们是一个学生类的编写者,在set设置年龄的方法中,我们要进行判断调用者输入的年龄是否正确

如果走了else,说明调用者写了错误的年龄,那么我们就要把错误暴露给他
new一个异常对象,然后再使用thorw将异常向上抛出(注意不是throws!)

上图报错的原因,是因为我们在set方法中创造了异常,那就要在其方法上声明存在此异常(编译时异常需要,运行时异常不需要),如下图

写完set方法后,回到主方法,调用set方法时,发现还是报错

这是因为我们在set方法里抛出了一个编译时异常(Exception),要在运行之前就解决掉,我们依旧声明异常,主方法后面也就加了throws

右键运行,当输入了错误的年龄后,就会展示我们之前写的异常提示

所以,当问题需要被暴露时,我们就可以使用throw和throws抛出和声明
换个视角,现在是调用我们方法的程序员和用户
当用户手滑输入了一个-23时,set方法直接抛出一个异常给用户,这是不可行的,所以调用者就要修改我们写的set方法
不选择throws,而是选择try catch捕获异常

当输入了错误年龄后,set方法抛出Exception,紧接着就被try catch捕获,并且给出了提示

5.getMessage
如下图,我们发现catch{}里给的提示和我们写的异常提示一模一样

为了简化代码,我们就可以使用被捕获的异常,调用里面的getMessage方法,打印我们的异常提示

总结

.

异常的两种处理方式--java进阶day08的更多相关文章
- Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】
[]如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...
- Java多线程13:读写锁和两种同步方式的对比
读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...
- Java学习-014-文本文件写入实例源代码(两种写入方式)
此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 第一种:文本文件写入,若文件存在则删除原文件,并重新创建文件.源代码如下所示: /** * @fun ...
- Java中String对象两种赋值方式的区别
本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...
- java的两种同步方式, Synchronized与ReentrantLock的区别
java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...
- Java Callable接口与Future接口的两种使用方式
Java Callable.Future的两种使用方式Callable+Futurepublic class Test { public static void main(String[] args) ...
- 细说java中Map的两种迭代方式
曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...
- JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解
在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...
- Java连载66-数组的两种初始化方式
一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就 ...
- Java中匿名类的两种实现方式(转)
使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式 ...
随机推荐
- 如何快速的开发一个完整的iOS直播app(礼物篇)
搭建礼物列表 使用modal,设置modal样式为custom,就能做到从小往上显示礼物列表,并且能看见前面的直播界面 礼物模型设计 一开始创建3个礼物模型,保存到数组,传入给礼物View展示,本来礼 ...
- kNN(K- Nearest Neighbor)基本原理
- MySQL SQL调优之索引
本篇记录MySQL的索引知识学习笔记,也方便自己以后查找复习 一.索引的概念MySQL官方给出的索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构.所以说索引就是排好序的快速查找数据结 ...
- 一探究竟!天翼云2023MWC展区“亮”了!
6月28日,2023MWC上海世界移动通信大会(简称"MWC上海")在上海新国际博览中心启幕.中国电信开设"数智万融 畅享未来"主题展区,从科技创新.安全筑防及 ...
- Zabbix Server 5.0 安装及Zabbix5.2 一键部署脚本
zabbix 5.0 安装部署 1.关闭防火墙和selinux,安装repository源 [1]关闭防火墙,SELINUX firewall-cmd --state #查看默认防火墙状态,关闭后显示 ...
- DP(优化)
史不分好坏.是史就应该冲进. 细节见其他题解. P10538 首先建出部分分 sub1 的图,发现是 DAG,于是设点为状态,即即将乘坐 \(j\) 车的最小代价 \(f_j\).这样的转移就是枚举上 ...
- Linux视频播放器安装
sudo add-apt-repository ppa:rvm/smplayer sudo apt-get update sudo apt-get install smplayer PPA: ppa ...
- 数据同步-同步mysql到iceberg后如何确定数据一致性
一.数据打快照做数据比较 1.mysql创建快照 优点:可以选择时间做快照,然后对比 缺点:需要额外的存储空间和处理时间,不好自动化,大表做快照成本高 2.实现方式 create database 快 ...
- 让 LLM 来评判 | 奖励模型相关内容
奖励模型相关内容 这是 让 LLM 来评判 系列文章的第五篇,敬请关注系列文章: 基础概念 选择 LLM 评估模型 设计你自己的评估 prompt 评估你的评估结果 奖励模型相关内容 技巧与提示 什么 ...
- 别再为文本提取抓狂!一站式文本提取神器Kreuzberg 助你解决PDF、图片、文档等多格式文件的文本提取难题
大家好,我是六哥,相信很多朋友肯定都有过从各种文档里提取文本的经历,那过程可太让人头疼了!今天就给大家分享一款超实用的现代Python库--Kreuzberg,帮你轻松解决文本提取的难题. 一.Kre ...