异常的两种处理方式--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中匿名类的两种实现方式(转)
使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式 ...
随机推荐
- Windows安全加固(四)
七.服务安全 1.禁用TCP/IP上的NetBIOS(协议所用端口139) 作用:禁用TCP/IP上的NetBIOS协议,可以关闭监听的UDP137.UDP138.UDP139端口. (1)使用快捷键 ...
- Python 问题汇总
一. Python 环境问题 使用pytest 在terminal中执行脚本调用python3.9, 而使用pycharm 的virtualenv 执行脚本调用的是python3.10, 由于环境不一 ...
- 使用Docker部署的基于binlog实现Mysql8
概念 MySQL 基于 Binlog 的主从复制(Master-Slave Replication)是 MySQL 数据库中实现数据复制的一种机制.在这种复制模式下,主库(Master)记录所有对数据 ...
- nio-总结列表
java IO体系图 IO流的操作规律总结: 1,明确体系:数据源:InputStream ,Reader数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符.数据 ...
- 史上最详细idea提交代码到github教程
史上最详细idea提交代码到github教程步骤前言github上创建空项目 idea上代码关联本地gitidea上代码本地提交解决Push rejected: Push to origin/mast ...
- dicom 在生成dcm文件的时候会出现乱码的处理方法
using Dicom.IO; using System; using System.Collections.Generic; using System.Linq; using System.Text ...
- python读取excel的文件
1.安装依赖包,并且导入 pip install xlrd import xlrd 2.打开文件 path = r"C:\Users\xiao\Desktop\服务体系.xls" ...
- Linux:安装nodejs
yum安装 自带版本 yum install nodejs 但是版本很低[6.17.1] 高版本 参考:链接 1.删除旧版本 yum remove nodejs 2.添加Node.js Yum存储库 ...
- Jenkins执行Shell脚本超时错误处理指南
Jenkins执行Shell脚本超时错误处理指南 在使用Jenkins进行自动化测试时,经常会遇到需要执行Shell脚本的情况.然而,当Shell脚本执行时间过长,超过了Jenkins配置的超时限制时 ...
- waterdrop同步mysql数据到hive
一.shell类型任务,提交到yarn集群 #!bin/bash#=========================数据源配置,只读账号=========================jdbc_ur ...