方法不接受可以约会的日期,为什么?

时间:2015-07-04 10:45:05

标签: java

我有一个方法有四个参数,其中两个是类型日期,我的问题是当日期为空时,我有异常,我的方法不接受可以为空的日期,我该如何解决,这个我的代码:< / p>

    Date StartDate=dateper1.getDate();
Date EndDate=dateper2.getDate();
System.out.println(StartDate);
m.SearchProduct(calcul, Designation,StartDate,EndDate);

方法:

public void SearchProduct(JTable calcul,String Designation,Date StartDate, Date EndDate)
{
try
{
conn=con.Connect();
stmt =  conn.createStatement();
ResultSet rsDesignation=   stmt.executeQuery("SELECT * FROM calcul WHERE designation='"+Designation+"' ");
ResultSet rsDate=stmt.executeQuery("SELECT * FROM calcul WHERE dateper<='"+EndDate+"' AND dateper>='"+StartDate+"'");
if(StartDate==null && EndDate==null )
this.GetAttribut(calcul, rsDesignation);    
if(   Designation.equals(" "))
this.GetAttribut(calcul, rsDate); 
stmt.close();
//c.commit();
conn.close();
} catch (Exception e) {
System.err.println( e.getClass().getName()+": "+ e.getMessage() );
System.exit(0);
}
}

3 个答案:

答案 0 :(得分:0)

您正在将空值传递给SQL。你的程序实际上收到了这个:

SELECT * FROM calcul WHERE dateper<='null' AND dateper>='null'

那是因为当null对象更改为String时,结果为null为String(实际字符n,u,l,l)。因此,数据库在编译此查询时会抛出异常 - 因为它没有意义。

你必须在代码中以某种方式处理空值 - 这取决于你想要实现的目标。

另外,请注意您使用的命名是推荐用于Java语言。您应该考虑使用 lowerCamelCase 而不是 UpperCamelCase 命名方法。

这是格式很漂亮的代码:

Date startDate = dateper1.getDate();
Date endDate = dateper2.getDate();
System.out.println(startDate);
m.searchProduct(calcul, designation, startDate, endDate);

public void searchProduct(JTable calcul, String designation, Date startDate,   Date endDate)
{
    try {
        conn=con.connect();
        stmt = conn.createStatement();
        ResultSet rsDesignation = stmt.executeQuery("SELECT * FROM calcul WHERE designation='" + designation + "'");
        ResultSet rsDate = stmt.executeQuery("SELECT * FROM calcul WHERE dateper<='" + endDate + "' AND dateper >= '" + startDate + "'");
        if(startDate  == null && endDate == null) {
            this.getAttribute(calcul, rsDesignation);
        }
        if(" ".equals(designation)) {
            this.getAttribute(calcul, rsDate); 
        }
        stmt.close();
        //c.commit();
        conn.close();
    } catch (Exception e) {
        System.err.println( e.getClass().getName()+": "+ e.getMessage() );
        System.exit(0);
    }
}

可读性是编程中非常重要的一个方面。正如您可能已经注意到的那样,格式漂亮的代码看起来更加令人愉悦(对于一个人来说也是如此;-))。

答案 1 :(得分:0)

ResultSet rsDate=stmt.executeQuery("SELECT * FROM calcul WHERE dateper<='"+EndDate+"' AND dateper>='"+StartDate+"'");
如果NullPointerExceptionEndDateStartDate

会抛出null

添加null支票或不允许null日期,例如@fge在评论中说。

答案 2 :(得分:0)

不要担心老兄,操作简单。改变你的这一行:

ResultSet rsDate=stmt.executeQuery("SELECT * FROM calcul WHERE dateper<='"+EndDate+"' AND dateper>='"+StartDate+"'");

接下来的那些:

Stringbuilder sql = new StringBuilder("SELECT * FROM calcul");
if (EndDate != null && StartDate != null){
    sql.append(" WHERE dateper<='"+EndDate+"' AND dateper>='"+StartDate+"'");
else if (EndDate == null && StartDate != null){
    sql.append(" WHERE dateper>='"+StartDate+"'");
}else if (EndDate != null && StartDate == null){
    sql.append(" WHERE dateper<='"+EndDate+"'");
}
ResultSet rsDate=stmt.executeQuery(sql);

此外,您可能更喜欢在每个条件中移动查询,因为查看代码时,只需要在任何日期不为null时执行rsDate查询。像这样:

if(StartDate==null && EndDate==null ){
    ResultSet rsDesignation=stmt.executeQuery("SELECT * FROM calcul WHERE designation='"+Designation+"' ");
    this.GetAttribut(calcul, rsDesignation);  
}  
if(Designation.equals(" ")){
    ResultSet rsDate=....; // The code above I wrote
    this.GetAttribut(calcul, rsDate); 
}