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的更多相关文章

  1. Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】

    []如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...

  2. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  3. Java学习-014-文本文件写入实例源代码(两种写入方式)

    此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 第一种:文本文件写入,若文件存在则删除原文件,并重新创建文件.源代码如下所示: /** * @fun ...

  4. Java中String对象两种赋值方式的区别

    本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...

  5. java的两种同步方式, Synchronized与ReentrantLock的区别

    java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...

  6. Java Callable接口与Future接口的两种使用方式

    Java Callable.Future的两种使用方式Callable+Futurepublic class Test { public static void main(String[] args) ...

  7. 细说java中Map的两种迭代方式

    曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...

  8. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  9. Java连载66-数组的两种初始化方式

    一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就 ...

  10. Java中匿名类的两种实现方式(转)

    使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式 ...

随机推荐

  1. 快速上手jquery

    优点 强大的选择器机制 优质的隐私迭代 链式编程 选择机制 选择器 标签名 $('div') id $('#id') class $('.clname') 属性 $('div:[name='66']' ...

  2. LCR 164. 破解闯关密码

    破解闯关密码 闯关游戏需要破解一组密码,闯关组给出的有关密码的线索是: 一个拥有密码所有元素的非负整数数组 password 密码是 password 中所有元素拼接后得到的最小的一个数 请编写一个程 ...

  3. Cesium中3DTiles使用CustomShader着色器渲染

    加载模型 新版本cesium加载3DTiles代码如下,后续效果只修改CustomShader内内容 //加载楼栋白膜 let tileset try { tileset = await Cesium ...

  4. C# Moq - Non-overridable members may not be used in setup / verification expressions

    测试: public class UnitTest1 { [TestMethod] public void TestMethod1() { Mock<TestClass> moc = ne ...

  5. .net core2.2版本下载地址

    下载地址: https://download.visualstudio.microsoft.com/download/pr/279de74e-f7e3-426b-94d8-7f31d32a129c/e ...

  6. 基于MPC的快速transformer安全推理框架

    论文:一种基于安全多方计算的快速Transformer安全推理方案-刘伟欣 摘要 数据隐私泄露问题:当前Transformer推理应用中用户的数据会被泄露给模型提供方 安全推理方法:基于MPC实现Tr ...

  7. Linux通配符和转移字符(扩展匹配文件名)、man帮助文档的使用

  8. 2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用go语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括0次): 选择任何一个下标 i,并将从该下标开始到数组末

    2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ.用go语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括0次): 选择任何一个下标 i,并将从该下标开始到数组末 ...

  9. SourceTree SSH第一次登录需要交互确认的问题

    问题 在SourceTree SSH配置完ssh之后向上提交代码的时候发现: The server's host key is not cached in the registry. You have ...

  10. 正确停止Oracle expdp/impdp作业操作方法

    1.使用命令查看在运行的作业名称,找到STATE是EXECUTING的作业名称. select job_name,state from dba_datapump_jobs; 2.再CMD命令窗口,键入 ...