为什么我的finally不能通过编译?

drugon 2004-08-10 04:29:38
我写了一段简单的代码来检验一下java中的try-catch-finally语句,可是为什么我的代码不能通过编译呢?
代码如下:(请高手指点)
import java.io.*;
import java.sql.*;
public class Data
{
public static void main(String args[])
{
Connection conn=null;
Statement stat=null;
ResultSet set=null;
try
{
Class.forName("org.gjt.mm.mysql.Driver");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
String url ="jdbc:mysql://localhost:3306/work?
user=root&password=&useUnicode=true&
characterEncoding=GB2312";
conn= DriverManager.getConnection(url);
stat=conn.createStatement();
set=stat.executeQuery("select * from company ");
while (set.next())
{
System.out.println(set.getString(1));
}
}
catch(SQLException ee)
{
ee.printStackTrace();
}
finally
{
set.close();
stat.close();
conn.close();
}
}
}
为什么我的这段代码在编译的时候总是提示下面的错误信息:

---------- Compile Java Program ----------
Data.java:35: unreported exception java.sql.SQLException; must be caught or declared to be thrown
set.close();
^
Data.java:36: unreported exception java.sql.SQLException; must be caught or declared to be thrown
stat.close();
^
Data.java:37: unreported exception java.sql.SQLException; must be caught or declared to be thrown
conn.close();
^
3 errors

请问是什么原因?
...全文
188 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qazxsw1982103 2004-08-11
  • 打赏
  • 举报
回复
iversonxk(艾弗森)

finally {
try{
set.close();
stat.close();
conn.close();
}
catch( SQLException e ) {
//your application
}
}
使用这个比较方便


回复人: cbhyk()

to 楼上:
想想如果set.close()这句出错的后果是什么
-------------------------------------------------------------------------

to cbhyk():

set.close()这句出错的后果是该错误会被finally块中的catch处理块接受,并执行catch处理块中的代码

这样写有什么问题?






drugon 2004-08-11
  • 打赏
  • 举报
回复
谢谢大家给我指出的意见,今天结帖了。同时欢迎大家继续讨论。
drugon 2004-08-11
  • 打赏
  • 举报
回复
对单个的程序一般有处面的try-catch来捕捉set.cloes()等一些的流的关闭是没有什么大的问题的,但是如果在一个比较大的工程里面,数据库只有有限个连接,如果在关闭连接的时候出了问题,也就是捕捉close()的那个try-catch块出现问题,那么很有可能这个连接以后再也不能被应用程序使用,造成资源浪费,所在想找一种方法,无论如果都可以强行的关闭连接,使数据库的连接可以重复使用。
shine333 2004-08-11
  • 打赏
  • 举报
回复
to 楼主

finally只代表无论try{}里面发生什么(除了像System.exit(0)之类),都能进到finally这个入口处,但是finally本身不是个保险箱,并不保证即使中间出错,所有代码还是会执行,所以还是要try catch,
所以写个release方法比较好,这个release应该是无论如何都不throw的
shine333 2004-08-11
  • 打赏
  • 举报
回复
直接关Connection好像有的写的不好的JDBC会出错的吧(在哪篇文章或书上看到过,自己没实践过)
Eraserpro 2004-08-10
  • 打赏
  • 举报
回复
不管那么多,直接把Connection关掉就行了,ResultSet,Statement不用关也无所谓!
chenchen2003 2004-08-10
  • 打赏
  • 举报
回复
编译时的错误信息不是很明显的告诉你.没有报SQLEXEPTION吗!!
捕捉这个异常.进行处理中就OK啦.
就是说要把set.close();这个放在TRY块中,然后在CATCH块中捕捉SQL异常进行处理.就OK啦.
drugon 2004-08-10
  • 打赏
  • 举报
回复
下班了,明天结。
haode 2004-08-10
  • 打赏
  • 举报
回复
建议如果不是非常必要的话,让数据库自己去管理这些就可以了。
drugon 2004-08-10
  • 打赏
  • 举报
回复
一般的数据库服务器都是可以设置客户端可以连接的最大数目,如果我们自己来管理数据库的连接,一种假设的情况是这些有效的数目在某个时刻在关闭的时候都出了问题,那么后面其它的客户想连接都连不上去了。这个时候系统就麻烦大了。因为我们自己去管理数据库连接,在关闭数据库连接时并不能保证所有的连接都能够正常的关闭,所以我个人觉得利用一些服务器去管理要方便一些。
weepp 2004-08-10
  • 打赏
  • 举报
回复
上面讲的非常好!学习学习!
cbhyk 2004-08-10
  • 打赏
  • 举报
回复
WebSphere的连接池能够处理孤儿连接(不再有地方使用又没有返回池中的连接),但是是在一个时间段(可配置)后才处理的。其它应用服务器不清楚,应该也差不多吧。就算有,也不应该依赖于连接池的这个功能。
drugon 2004-08-10
  • 打赏
  • 举报
回复
如果是使用缓冲池来连接数据库的话,在关闭连接的时候出错,那么很可能就是丢失掉一个有效的数据库连接。有没有什么办法可以强制性的关闭,即使是你在关闭时出现了异常情况,也将数据库的连接给关闭?这样就不担心会产生丢失数据库的连接了。
maowu 2004-08-10
  • 打赏
  • 举报
回复
呵呵,分别try& catch把。
cbhyk 2004-08-10
  • 打赏
  • 举报
回复
to 楼上:
想想如果set.close()这句出错的后果是什么
iversonxk 2004-08-10
  • 打赏
  • 举报
回复
finally {
try{
set.close();
stat.close();
conn.close();
}
catch( SQLException e ) {
//your application
}
}
使用这个比较方便
tomcatjava 2004-08-10
  • 打赏
  • 举报
回复
finally {
try{
set.close();
stat.close();
conn.close();
}
catch( SQLException e ) {
//your application
}
}
cbhyk 2004-08-10
  • 打赏
  • 举报
回复
或:

finally
{
DbUtil.close(rs, stat, conn);
}
cbhyk 2004-08-10
  • 打赏
  • 举报
回复
public class DbUtil
{
public static void close(Connection conn)
{
try
{
if(conn != null)
conn.close();
}
catch (SQLException e)
{
//ignore
}
}


public static void close(Statement stmt)
{
try
{
if(stmt != null)
stmt.close();
}
catch (SQLException e)
{
//ignore
}
}

public static void close(ResultSet rs)
{
try
{
if(rs != null)
rs.close();
}
catch (SQLException e)
{
//ignore
}
}

public static void close(ResultSet rs, Statement stmt, Connection conn)
{
close(rs);
close(stmt);
close(conn);
}
}

import java.io.*;
import java.sql.*;
public class Data
{
public static void main(String args[])
{
Connection conn=null;
Statement stat=null;
ResultSet set=null;
try
{
Class.forName("org.gjt.mm.mysql.Driver");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
String url ="jdbc:mysql://localhost:3306/work?
user=root&password=&useUnicode=true&
characterEncoding=GB2312";
conn= DriverManager.getConnection(url);
stat=conn.createStatement();
set=stat.executeQuery("select * from company ");
while (set.next())
{
System.out.println(set.getString(1));
}
}
catch(SQLException ee)
{
ee.printStackTrace();
}
finally
{
DbUtil.close(rs);
DbUtil.close(stat);
DbUtil.close(conn);
}
}
}
drugon 2004-08-10
  • 打赏
  • 举报
回复
这样在finally中加入多个try-catch显得有些麻烦,有没有更好的方法?不过还是要感谢你。
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧