问题描述
我能够插入日期并将数据插入数据库,但是当我尝试提取数据并在 jDateChooser 中显示它时,它显示了主题所述的错误。为什么?
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.*;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import net.proteanit.sql.dbutils;
import java.util.Date;
这些是我导入的包
private void displayTable(){
try {
Class.forName("com.MysqL.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:MysqL://localhost:3308/java_his_db","root","");
String sql = "select * from reservation";
PreparedStatement ps = con.prepareStatement(sql);
ResultSet res = ps.executeQuery();
jTable_reservation.setModel(dbutils.resultSetToTableModel(res));
}catch (Exception e) {
JOptionPane.showMessageDialog(null,e);
}
}
这是我将数据显示到 jTable 中的私人空白
private void jTable_reservationMouseClicked(java.awt.event.MouseEvent evt) {
// Todo add your handling code here:
DefaultTableModel model = (DefaultTableModel)jTable_reservation.getModel();
int rowInd = jTable_reservation.getSelectedRow();
roomID.setText(model.getValueAt(rowInd,0).toString());
customerID.setText(model.getValueAt(rowInd,1).toString());
try {
Date selectin = new SimpleDateFormat("yyyy-MM-dd").parse((String)model.getValueAt(rowInd,3));
jDateChooser_in.setDate(selectin);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,e);
}
}
每当我单击表格中的一行时,catch 异常就会显示上述错误。
java.lang.classCastException:类 java.sql.Date 不能转换为 java.lang.String(java.sql.Date 在加载器“平台”的模块 java.sql 中;java.sql. lang.string 在加载器 'boostrap' 的模块 java.base 中)
如何解决这个问题?
解决方法
从错误中可以明显看出,以下调用返回的是 java.sql.Date
类型的对象,该对象无法转换为 String
。
model.getValueAt(rowInd,3)
简单地说,请按以下步骤操作:
java.util.Date selectin = model.getValueAt(rowInd,3);
如果您想将其格式化为某种特定模式 (String
),您可以使用 SimpleDateFormat
来实现,例如
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = sdf.format(selectin);
请注意,java.util
的日期时间 API 及其格式 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API。
- 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7。
- 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
您可以使用 Date#toInstant
从 java.util.Date
切换到 java.time.Instant
,后者是现代日期时间 API 的一种类型。
Instant instant = selectin.toInstant();
LocalDate dateSelectin = instant.atZone(ZoneId.systemDefault()).toLocalDate();
String strDateSelectin = dateSelectin.toString();
将 ZoneId.systemDefault()
替换为适用的时区,例如ZoneId.of("Europe/London")
根据您的要求。
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。