读书笔记7-《crazy java》

数据库连接网络连接磁盘文件等,打开这些物理资源之后必须显式关闭,否则会引起资源泄漏

垃圾回收机制属于java内存管理的一部分,只负责回收堆内存中分配的内存,至于程序中打开的物理资源,无能为力。

关闭资源的3个要点:
1. 使用finally块来关闭物理资源,保证关闭操作总是会被执行;
2. 关闭每个资源之前先保证引用该资源的引用变量不为null;
3. 位每个物理资源单独使用try…catch块关闭资源,保证关闭资源时引发的异常不会影响其他资源的关闭。

finally块的执行规则:如果程序在执行System.exit(0)之后,finally块是否还会得到执行的机会?(有时并不会执行)因为无论try块是否正常结束,还是中途非正常的退出,只要java虚拟机不退出,finally块确实都会执行。然而当try语句块根本没结束其执行的过程,System.exit(0)将停止当前的线程和所有其他当场死亡的线程,即System.exit(0)会直接退出JVM。finally块并不能让已经停止的线程继续执行。

System.exit(0)被调用时,虚拟机退出前要执行两项清理工作:
1. 执行系统中注册的所有关闭钩子
2. 如果程序中调用了System.runFinalizerOnExit(true),那么JVM会对所有还未结束的对象调用Finalizer

finally块和方法返回值:当java执行try, catch块遇到了return语句会导致该方法立即结束。系统执行完return语句之后,并不会立即结束该方法,而是去寻找该异常处理流程中是否包含finally块,若无finally块则方法终止,返回相应返回值。若有,则系统执行finally块,只有当finally块执行完成后,系统才会跳出来(到try, catch块)根据return结束方法。如果finally块里使用了return语句来导致方法结束,则finally块已经结束了方法,系统将不会跳回去执行try, catch块里的任何代码。

进行异常捕获时,先捕获小的异常,再捕获大的异常。即捕捉父类异常的catch块都应该排在捕捉子类异常的catch块之后

不要在程序中多度使用异常机制,千万不要使用异常处理机制来代替流程控制,对于程序中各种能够预知的情况,应该尽量进行处理,不要盲目的使用异常捕捉来代替流程控制。

异常:
1. IndexOutOfBoundsExecption、NullPointerException都是RuntimeExecption的子类,因此它们都属于运行时异常;
2. IOExecption、ClassNotFoundExecption异常则属于checked异常;
3. RunTimeExecption类及其子类实例被称为Runtime异常,不是RunTimeExecption类及其子类的异常实例则被称为Checked异常
4. 程序可以在任意相捕捉的地方捕捉RunTimeExecption异常、Exception,但对于其他Checked异常,只有当try块可能抛出该异常时catch块才能捕捉该Checked异常。

Checked异常的处理方式:
1. 当前方法明确知道如何处理该异常,程序应该使用try…catch块来捕获该遗产,然后在对应的catch块中修复该异常;
2. 当前方法不知道如何处理该异常,应该在定义该方法时声明抛出该异常

如果程序知道该如何修复指定异常,应该在catch块内尽量修复该异常,若不知道该如何修复,也没有任何修复,千万不要再次调用可能导致该异常的方法。

无论如何不要在finally块中调用可能引起异常的方法,因为这将导致该方法不能被正常抛出,甚至stackOverflowError错误也不能终止程序,只能采用强行结束java.exe进程的方式来终止程序的运行。

子类重写父类的方法时,不能声明抛出比父类方法类型更多、范围更大的异常。即只能什么抛出父类方法所声明异常的子类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值