java.lang.ClassCastException: class java.sql.Date 无法转换为 java.lang.String

java.lang.ClassCastException: class java.sql.Date cannot be cast to java.lang.String

我能够将日期插入到数据库中,但是当我尝试取出数据并将其显示在 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);
                           }
 
}  

这些是我用来将数据提取到文本字段中的代码。

每当我单击 table 中的一行时,catch 异常就会显示上面的错误。

java.lang.ClassCastException:class java.sql.Date 无法转换为 java.lang.String(java.sql.Date 在模块 java.sql 加载程序 'platform';java.lang.string 在加载程序 'boostrap')

的模块 java.base 中

如何解决这个问题?

从错误中可以清楚地看出,以下调用 returns 类型 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 and

您可以使用 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") 根据您的要求。

Trail: Date Time.

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