Exception - 异常 - Java - 细节狂魔,2024年最新面试金九银十的说法有哪些

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

在操作之前就做充分的检查。

2. EAFP::It’s Easier to Ask Forgiveness than Permission;.

事后获取原谅比事前获取许可更容易。也就是先操作,遇到问题再处理。

 

异常的核心思想就是 EAFP.


LBYL风格的代码(不使用异常)


英雄联盟手游

boolean ret = false;

ret = 登陆游戏();

if (!ret) {// 如果登录失败,执行下面的的操作

处理登陆游戏错误;

return;

}

ret = 开始匹配();

if (!ret) {// 如果匹配失败,执行下面的的操作

处理匹配错误;

return;

}

ret = 游戏确认();// 如果游戏确认失败,执行下面的的操作

if (!ret) {

处理游戏确认错误;

return;

}

ret = 选择英雄();// 如果选择英雄失败,执行下面的的操作

if (!ret) {

处理选择英雄错误;

return;

}

ret = 载入游戏画面(); 如果载入游戏界面失败,执行下面的的操作

if (!ret) {

处理载入游戏错误;

return;

}


EAFP 风格的代码(使用异常)


try {// 把可能出现异常的代码,放到try当中

登陆游戏();

开始匹配();

游戏确认();

选择英雄();

载入游戏画面();

// catch == 捕捉,捕捉什么呢?捕捉异常

// 异常有很多种,所以不能只捕捉一种异常

} catch (登陆游戏异常) {

处理登陆游戏异常;

} catch (开始匹配异常) {

处理开始匹配异常;

} catch (游戏确认异常) {

处理游戏确认异常;

} catch (选择英雄异常) {

处理选择英雄异常;

} catch (载入游戏画面异常) {

处理载入游戏画面异常;

}

总结


对比两种不同风格的代码, 我们可以发现, 使用第一种方式, 正常流程和错误处理流程代码混在一起, 代码整体显的比较混乱. 而第二种方式正常流程和错误流程是分离开的, 更容易理解代码


异常的基本用法

======================================================================

捕获异常


基本语法:

try{

有可能出现异常的语句 ;

}catch (异常类型 异常对象) {

}finally {

异常的出口

}

注意事项:

1. try 代码块中放的是可能出现异常的代码.

2. catch 代码块中放的是出现异常后的处理行为.

3. finally 代码块中的代码用于处理善后工作, 会在最后执行.

4. 其中 finally 都可以根据情况选择加或者不加.,catch必须加,不然程序会报错。


实例1

在这里插入图片描述


实例1的深度解析

在没处理异常的情况下,程序方式异常为什么会终止运行。

如果在不处理异常的情况下,那么这个异常会交由JVM处理,一旦交给JVM处理,程序立马从异常代码的位置终止了。

而 try,catch 是我们 人为去处理异常的方法,并不会导致程序,立马被终止,而是跳过去,继续运行,直至程序正常结束。

当然。如果 catch 能捕捉异常类型,与 try中代码发生的异常类型不符,就会导致捕捉异常失败,从而交由JVM处理,那么程序会直接终止运行。


错误信息与处理

在这里插入图片描述


还有一个点:判断程序是否是正常结束运行

在这里插入图片描述


重点:


异常的种类有很多, 我们要根据不同的业务场景来决定.

对于比较严重的问题(例如和算钱相关的场景), 应该让程序直接崩溃, 防止造成更严重的后果

(比如:程序出现异常,把我们的钱给别人红包或者转账了,那还了得,这种情况下,程序崩溃就是最好处理方式,以免造成更大损失,本来就没几个钱。。。)

对于不太严重的问题(大多数场景), 可以记录错误日志, 并通过监控报警程序及时通知程序猿

大概怎么通知,就是通过一个接口,实现一个发邮箱,或者打电话来处理。这个是真的可以做到的。后面我会写一个用代码去实现发邮箱的博客

对于可能会恢复的问题(和网络相关的场景), 可以尝试进行重试.(例如:网络断开,正在刷新重连)

在我们当前的代码中采取的是经过简化的第二种方式. 我们记录的错误日志是出现异常的方法调用信息, 能很快

速的让我们找到出现异常的位置. 以后在实际工作中我们会采取更完备的方式来记录异常信息


实例2(处理空指针异常与数组越界异常 - catch 捕捉异常不限于1种)


在这里插入图片描述


异常的体系结构

======================================================================

Java 内置了丰富的异常体系, 用来表示不同情况下的异常.

下图表示 Java 内置的异常类之间的继承关系

在这里插入图片描述

顶层类 Throwable 派生出两个重要的子类, Error 和 Exception

其中 Error 指的是 Java 运行时内部错误和资源耗尽错误. 应用程序不抛出此类异常. 这种内部错误一旦出现,

除了告知用户并使程序终止之外, 再无能为力. 这种情况很少出现.

Exception 是我们程序猿所使用的异常类的父类.

其中 Exception 有一个子类称为 RuntimeException , 这里面又派生出很多我们常见的异常类

NullPointerException , IndexOutOfBoundsException 等.

Java语言规范将派生于 Error 类或 RuntimeException 类的所有异常称为 非受查异常, 所有的其他异常称为 受查

异常.


小技巧(快速得知目前异常的父类,父类的父类。。。。)


在这里插入图片描述


前面我们catch的异常 都是 精确到某种异常类型的,而且 还想要捕获其它异常,就需要再写一个catch捕获,或者用按位或,再链接一个异常,但是现在我们知道这些异常的最终父类,那么我们可不可直接捕获它,这样我们只用写一个捕获,捕获一个异常。该异常包括所有子类异常。一劳永逸,岂不美哉。

在这里插入图片描述


还有一种捕获写法,是可以怎么去写的。来看下面程序

在这里插入图片描述

但是两个捕获换个位置就不行。(捕获子类异常,必须要在捕获父类异常的前面)

在这里插入图片描述

所以还是强调一个点,catch在捕获异常时,最好捕获具体的异常类。


实例3 (解决克隆异常)


在这里插入图片描述


finally 表示最后的善后工作,例如释放资源

=======================================================================================

实例4 (处理输入数据不匹配异常)


在这里插入图片描述


实例4 (技巧偷油)

在这里插入图片描述


疑问:将异常交由JVM处理,我们的finally还会被执行吗?


答案是会!

在这里插入图片描述


实例5 (处理调用方法所带来的异常)


在这里插入图片描述

作者心生一个疑问,如果是别人写好的一个方法,我直接拿来用。我怎么知道它当中会不会有异常,而且也不知道该异常的类型。那么该怎么做呢?来看!

在这里插入图片描述


画面一转,继续讲finally 的一些特点,来看下面


在这里插入图片描述


异常处理流程

=====================================================================

1.程序先执行 try 中的代码

2.如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.

3.如果找到匹配的异常类型, 就会执行 catch 中的代码

4.如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.

5.无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).

6.如果上层调用者也没有处理的了(liao)异常, 那么就继续向上传递.

7.一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止


抛出异常

===================================================================

除了 Java 内置的类会抛出一些异常之外, 程序猿也可以手动抛出某个异常. 使用 throw 关键字完成这个操作.。

在这里插入图片描述

再来看 一个 throw 案例(上图中throw抛出的自定义异常,只是自定义了异常错误信息,并不是真正意义上的自定义异常类型,文章最后会讲)

在这里插入图片描述


例题(读取文件)


最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


例题(读取文件)


最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

[外链图片转存中…(img-2HD0HopZ-1713600182439)]

《Java高级架构知识》

[外链图片转存中…(img-sIgoydAb-1713600182440)]

《算法知识》

[外链图片转存中…(img-BMDryAXE-1713600182441)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-MJzgmxee-1713600182441)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值