如何通过RMI使用数组方法获取数据库表完整数据并在JTable展示
问题修复方案
报错1:接口方法编译错误
原因有2个:
- Java接口中静态方法必须提供实现体,而RMI远程调用的方法必须是可重写的实例方法,不能声明为static
Remote Exception拼写错误,正确写法是连写的RemoteException,中间不能有空格
修正后的接口代码:
import java.rmi.Remote; import java.rmi.RemoteException; // 不建议用Interface作为类名,属于Java关联关键字,容易引发混淆 public interface MyRemoteInterface extends Remote { // 接口方法默认public abstract,不需要加static修饰 String[] getArray() throws RemoteException; }
报错2:实现类找不到符号tbData
原因有2个:
tbData是在while循环内部声明的,作用域仅限制在循环块内,循环外无法访问- 每次循环都新建长度为1的数组,只会覆盖之前的内容,最终只能保存最后一条数据,无法存储全表内容
- 额外问题:实现类的方法不能加static,静态方法无法重写接口的实例方法,会导致接口实现不生效
- 额外问题:构造方法中的
Remote Exception同样存在拼写错误,中间不能有空格
你可以先用ArrayList动态收集所有数据,再转为数组返回,修正后的实现类代码:
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import javax.swing.JOptionPane; public class TheImplementation extends UnicastRemoteObject implements MyRemoteInterface{ public TheImplementation() throws RemoteException{ super(); } private static final long serialVersionUID = -3763231206310559L; // 去掉static修饰,和接口方法签名保持一致 @Override public String[] getArray() throws RemoteException{ ArrayList<String> fruitList = new ArrayList<>(); try { Connection connection = ConnectionProvider.getConnection(); Statement st = connection.createStatement(); ResultSet rs = st.executeQuery("select * from details"); while(rs.next()) { String fruitdetails = rs.getString("fruit"); fruitList.add(fruitdetails); } // 建议补充资源关闭逻辑,避免数据库连接泄露 rs.close(); st.close(); connection.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, e); } // 集合转为字符串数组返回 return fruitList.toArray(new String[0]); } }
额外注意事项
- RMI远程调用的方法不能声明为static,必须是实例方法才能被代理层调用
- 后续客户端拿到返回的字符串数组后,直接封装到JTable的TableModel里即可完成渲染
内容的提问来源于stack exchange,提问作者HelloNiceToMeetYou
相关产品推荐
相关产品推荐

