我有一个方法有四个参数,其中两个是类型日期,我的问题是当日期为空时,我有异常,我的方法不接受可以为空的日期,我该如何解决,这个我的代码:< / 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);
}
}
答案 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+"'");
如果NullPointerException
或EndDate
为StartDate
,会抛出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);
}