java.lang.ClassCastException:类java.sql.Date不能强制转换为java.lang.



我可以插入日期并将数据插入数据库,但当我试图取出数据并将其显示在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在加载器"platform"的模块java.sql中;java.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已过时且为错误产品。建议完全停止使用它们,并切换到现代日期时间API。

  • 无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen BackportJava.time的大部分功能向后移植到Java 6&7
  • 如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API

您可以使用Date#toInstantjava.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")

跟踪:日期时间了解有关现代日期时间API的更多信息。

相关内容

  • 没有找到相关文章

最新更新