gpt4 book ai didi

java - 尝试访问匿名内部类中的 try-with-resource 资源时抛出异常

转载 作者:行者123 更新时间:2023-11-30 03:35:43 29 4
gpt4 key购买 nike

我正在开发一个项目,其中使用数据库中的数据填充表。我正在使用 try-with-resources 语句,因为我希望在离开 try 后关闭我的 ConnectionStatementResultSet 对象-with-resources 语句。 在我的 try block 中,我声明了一个 JTable 对象,该对象使用匿名内部类,用数据库中的数据填充表。

问题:从匿名内部类中尝试访问 try-with 内资源的任何方法中收到java.sql.SQLException:ResultSet 关闭后不允许操作 -资源括号。

问题:我需要做什么或更改什么,以便我的资源可以由位于 try-with-resources 语句内的匿名内部类访问

public class School extends JFrame{
private JTable mytable;
String url="jdbc:mysql://localhost:3306/students";//am connecting to the students database
String username="";
String password="";
public School(){
super("computer science students");

try(Connection con=DriverManager.getConnection(url, username,password);
Statement smt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rst=smt.executeQuery("select * from students.studentstable")){

final ResultSetMetaData metadata=rst.getMetaData();
mytable=new JTable(new DefaultTableModel(){
@Override
public int getRowCount(){
try{
rst.last();
return rst.getRow();
}catch(SQLException sqlex){
System.out.println(sqlex);
return 0;
}
}
@Override
public int getColumnCount(){
try{
return metadata.getColumnCount();
}catch(SQLException sqlex){
System.out.println(sqlex);
return 0;
}
}
@Override
public Class getColumnClass(int col){
try{
String classname=metadata.getColumnClassName(col+1);
return Class.forName(classname);
}catch(SQLException |ClassNotFoundException sqlex){
System.out.println(sqlex.getMessage());
return Object.class;
}
}
@Override
public String getColumnName(int col){
try{
String name=metadata.getColumnName(col+1);
return name;
}catch(SQLException sqlex){
System.out.println(sqlex.getErrorCode());
return "";
}
}

@Override
public Object getValueAt(int row,int col){
try{
rst.absolute(row+1);
return rst.getObject(col+1);
}catch(SQLException sqlex){
System.out.println(sqlex.getErrorCode());
return "";
}
}
});
JScrollPane pane=new JScrollPane(mytable);
add(pane);
}catch(SQLException sqlexc){
System.out.println(sqlexc);
}
}
public static void main(String[] args) {
School frame=new School();
frame.setVisible(true);
frame.setSize(400,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

最佳答案

问题是,模型的方法在您离开 try-with-resources block 后执行(可能很长时间)。因此,您的连接当时已经关闭,而模型对象的方法仍然引用已关闭连接的 ResultSet-Object(因为它是隐式最终的)。

目前的工作流程如下:

  1. 连接已打开
  2. 创建 ResultSet 对象 r
  3. 创建匿名模型对象 m
  4. 表 t 已创建并引用模型 m
  5. 连接和结果集已关闭
  6. [也许还有其他操作]
  7. 表 t 使用模型的方法来计算行数、值......

在步骤 7 中,模型的方法尝试使用 ResultSet 对象 r 来获取信息。这会导致您的异常。

为了使其正常工作,您必须在连接关闭之前提取必要的信息(行数、值)并将结果传递给模型的方法(也许可以使用最终对象)或在模型的方法中重新打开连接当需要信息时(延迟加载值)。

编辑:树 -> 表(命名正确的数据结构)

关于java - 尝试访问匿名内部类中的 try-with-resource 资源时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27944076/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com