finally中流关闭失败需要抛出异常吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了finally中流关闭失败需要抛出异常吗相关的知识,希望对你有一定的参考价值。
不需要,finally中的代码是一定会执行的,即使在finally中流关闭失败,也不会影响程序的正常执行,所以不需要抛出异常。 参考技术A 在java中,不建议在try-chatch块的finally部分中抛出异常,因为隐藏了try或catch块中抛出的任何未处理的throwable的传播。 根据默认声纳配置文件,此做法是blocker级别违规。声纳错误:从此finally块中删除此throw语句。
finally中可以操作数据库吗
finally中可以操作数据库吗不可以的,finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。
之前在写爬虫的时候数据库连接的频率很高,有时候数据处理的不好,sql报错后,抛出异常但后边的数据库连接没有断开。导致最后数据库连接数过大,不让再连接了(因为是个人库,所以直接重启了一下)。这个释放数据库连接的操作就可以用finally来进行。
首先看一下没有用finally的代码(不能直接运行,能看懂什么意思就行)
复制代码
复制代码
Connection conn;
Statement stmt;
try
conn = DriverManager.getConnection(url,userName,password);
stmt = conn.createStatement;
String sql = "sql";//需要执行的sql
stmt.executeUpdate(sql);
stmt.close();
conn.close();
catch(Exception e)
e.printStackTrace();
复制代码
复制代码
在程序正常运行的时候,没有异常抛出,没有问题。
但在程序抛出异常(sql出错了),try里面的语句不执行了直接被执行catch里面的语句了,就造成了一个数据库连接没有正常关闭。数据量如果大起来,数据库的最大连接数到达上限,就不再允许创建新的连接了。
然后finally的用处现在就能体现出来了
复制代码
复制代码
Connection conn = null;
Statement stmt = null;
try
conn = DriverManager.getConnection(url,userName,password);
stmt = conn.createStatement;
String sql = "sql";//需要执行的sql
stmt.executeUpdate(sql);
stmt.close();
conn.close();
catch (SQLException e)
e.printStackTrace();
finally
if(stmt! = NULL)
stmt.close();
if(conn! = NULL)
conn.close();
复制代码
复制代码
这样即使sql运行出错,抛出了异常,在最后的finally代码中再进行一次数据库连接的判断,就可以保证数据库连接资源不会被平白无故的浪费掉。 参考技术A 是可以操作数据库的
1.finally是用于释放资源的关键字,常用于IO流操作和数据库操作中
2.finally一定会执行,除非在执行之前使用退出jvm虚拟机的操作
3.finally执行前,如果使用了return语句,按道理来说,应该是方法都已经返回了,不会执行的,但事实上,在执行return语句时,在完全执行完之前,会先检查是否有finally语句需要执行,如果有,则先执行finally语句再执行完return语句(如果在finally里修改变量值,不影响return的变量值)
4.不可在finally里写return语句
以上是关于finally中流关闭失败需要抛出异常吗的主要内容,如果未能解决你的问题,请参考以下文章
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表啥意
1.9 try-with-resources 优先于try-finally
Java异常处理中关键字throws,throw,try,catch,finally分别代表啥意义?在try块中可以抛出异常吗?