Java程序设计(高级及专题)- 异常机制,深入分析

本文详细解释了Java中的try-catch-finally语句结构,包括如何捕获运行时异常和检查异常,finally块的作用,以及try-finally在资源管理和异常处理中的应用。还讨论了自定义异常和Java开发学习资源的重要性。
摘要由CSDN通过智能技术生成

这里只是用于演示catch块捕获的顺序。捕获多个异常时,可以使用catch(Exception1 | Exception2| Exception3)的形式来优化捕获异常的代码结构。

将声明异常、抛出异常和捕获异常综合在一起。

例如:

public static void main(String[] args) {

for(int i = 2; i < 100; i++) {

//对运行时异常,可以选择捕获也可以不选择捕获

if(isPrime(i)) {

System.out.print(i + " ");

}

}

} //检测是否为质数

public static boolean isPrime(int num) throws IllegalArgumentException{

//抛出一个运行时异常

if(num < 2) throw new IllegalArgumentException(“质数不能小于2”);

for(int i = 2; i < num; i++) {

if(num % i == 0) {//若能被1和本身之外的数整除,则非质数

return false;

}

}

return true;

}

因为抛出的是运行时异常,可以选择捕获或者不捕获。但如果抛出检查异常,在编译时就必须选择捕获或者声明。

  • finally语句块

无论是否有异常,finally块中的代码总是会被执行的。 finally语句在执行关闭资源的语句时非常有用。

//第一种形式 式

try {

//执行程序代码,可能会出现异常

}catch(Exception e) {

//捕获异常并处理

}finally {

//必执行的代码

}

//第二种形

try {

//执行程序代码,可能会出现异常

}finally {

//必执行的代码

}

  • try-catch-finally的执行流程

try块中引起异常,异常代码之后的语句不再执行,若被catch块捕获,执行匹配的catch块,然后执行finally语句。若catch块不能捕获异常,则执行finally语句,之后将异常传递给这个方法的调用者。

Scanner sc = new Scanner(System.in);

int a = 0; //保证局部变量a在各个块中可用

try {

a = sc.nextInt();

if(a < 0) throw new IllegalArgumentException();

System.out.println(“执行完try语句。a:” + a);

}catch(IllegalArgumentException e){

System.out.println(“执行catch语句”);

System.out.println(“数值小于0,不符合。已设为默认值 1”);

a = 1;

}finally {

System.out.println(“执行finally语句。a:” + a);

}

输出并分析:

//未引发异常 //引发异常并捕获

5 -5

执行完try语句。a:5 执行catch语句

执行finally语句。a:5 数值小于0,不符合。已设为默认值 1

执行finally语句。a:1

  • try-finally的执行流程

try块中引起异常,异常代码之后的语句不再执行,直接执行finally语句。 try块没有引发异常,则执行完try块就执行finally语句。

try-finally可用在不需要捕获异常的代码,可以保证资源在使用后被关闭。例如IO流中执行完相应操作后,关闭相应资源;使用Lock对象保证线程同步,通过finally可以保证锁会被释放;数据库连接代码时,关闭连接操作等等。

例如:

//以Lock加锁为例,演示try-finally

ReentrantLock lock = new ReentrantLock();

try {

//需要加锁的代码

}finally {

lock.unlock(); //保证锁一定被释放

}

finally遇见如下情况不会执行:

1、在前面的代码中用了System.exit()退出程序。

2、finally语句块中发生了异常。

3、程序所在的线程死亡。

4、关闭CPU。

  • try、catch、finally、throw和throws使用归纳

try、catch和finally都不能单独使用,只能是try-catch、try-finally或者try-catch-finally。

try语句块监控代码,出现异常就停止执行下面的代码,然后将异常移交给catch语句块来处理。

finally语句块中的代码一定会被执行,常用于回收资源 。

throws:声明一个异常,告知方法调用者。

throw :抛出一个异常,至于该异常被捕获还是继续抛出都与它无关。

  • Java编程思想一书中,对异常的总结。

在恰当的级别处理问题。(在知道该如何处理的情况下了捕获异常。)

解决问题并且重新调用产生异常的方法。

进行少许修补,然后绕过异常发生的地方继续执行。

用别的数据进行计算,以代替方法预计会返回的值。

把当前运行环境下能做的事尽量做完,然后把相同的异常重抛到更高层。

把当前运行环境下能做的事尽量做完,然后把不同的异常抛到更高层。

终止程序。

进行简化(如果你的

异常模式使问题变得太复杂,那么用起来会非常痛苦)。

让类库和程序更安全。

自定义异常

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

通过继承Exception类来定义一个异常类。Java已经提供了很多异常类,尽量使用这些异常类而不要创建自己的异常类。除非Java的异常类不能很好地描述问题时,才自定义异常来进行准确描述。对于自定义异常,不需要太多功能,类名能准确描述问题是关键。

例如:

//判断长度是否合法的自定义异常

public class LengthException extends Exception {

public LengthException() {}

public LengthException(String s) {

super(s);

}

@Override

public String getMessage() {

return super.getMessage();
}
}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。

对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。

你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:

请转发本文支持一下

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

,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:

请转发本文支持一下

[外链图片转存中…(img-mAN7tIuU-1712793952164)]

[外链图片转存中…(img-gUWlkbDY-1712793952165)]

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

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值