簡體   English   中英

在將日期發送到DAO類時獲取類強制轉換異常

[英]getting Class Cast Exception while sending date to DAO Class

// I am trying to send date to my dao class but i am getting exception    
    String dateInString = request.getParameter("date");
                Date date = null;

                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
                try {
// i am importing java.sql.Date
                  //i am getting java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
                    date = (Date) sdf.parse(dateInString);
                } catch (ParseException e) {

                    e.printStackTrace();
                }

                LeaveBalance leave = new LeaveBalance(associateID, date,
                        bufferApplicable, buffer);
                assoicatesDAO = new AssociatesDAO();
                boolean success = assoicatesDAO.leaveBalance(leave);
                if (success) {
                    msg = "Associate's leave has been added successfully.";
                } else {
                    msg = "****";
                }
                request.setAttribute("responseMessage", msg);
                dispatcher = request.getRequestDispatcher("/jsp/success.jsp");
                dispatcher.forward(request, response);

            }

您需要使用java.util.Date因為SimpleDateFormat處理java.util.Date不是 java.sql.Date

拋出強制異常,以指示代碼已嘗試將對象強制轉換為不是實例的子類。

因此,例如,當嘗試將Integer轉換為String時,String不是Integer的子類,因此將引發ClassCastException。

Object i = Integer.valueOf(42);
String s = (String)i;            // ClassCastException thrown here.

在您的代碼中,您應該

import java.util.Date;

     date = sdf.parse(dateInString); //thanks to @ Mustafa sabir

使用import java.util.Date代替java.sql.Date

SimpleDateFormatObject.parse() 

將返回類型為java.util.Date Date,因此在這種情況下,您將不需要像在此處所做的那樣強制轉換

date = (Date) sdf.parse(dateInString);

java.sql.Date是java.util.Date的子類。 這意味着sql.Date包含比其超類更多的詳細信息(它更加專業)。 這就是為什么您不能將util.Date強制轉換為sql.Date的原因:JVM無法“填補空白”。 相反,這不是問題。

對於解決方案,可以導入java.util.Date而不是java.sql.Date,或者,如果這破壞了代碼的其他部分,則只需在代碼中使用完全限定的類名即可:

java.util.Date date = null;
// etc... 

此類的import聲明為java.sql.Date 由於SimpleDateFormat.parse(String)返回java.util.Date ,因此您可能不得不從java.util導入正確的Date

但是,在其余代碼中都需要java.sql.Date的情況下,並且必須保持導入聲明相同,請更改以下內容:

{
    // Declare date as proper Date
    java.util.Date date = null;

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        /* // Cast to proper Date
         * date = (java.util.Date) sdf.parse(dateInString);
         * This cast is actually redundant, so just use:
         */
        date = sdf.parse(dateInString);
    }
    // ...
}

問題是您的Date date變量的類型為java.sql.Date ,而sdf.parse()返回java.util.Date 。因此, date=sdf.parse(..)處的異常。 導入java.util.Date而不是java.sql.Date

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM