做的图书管理系统,在图书借阅那一块 出现如下错误:
HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause java.lang.IllegalArgumentException
java.sql.Date.valueOf(Unknown Source)
com.dao.BorrowDAO.insertBorrow(BorrowDAO.java:36)
com.action.Borrow.bookborrow(Borrow.java:122)
com.action.Borrow.execute(Borrow.java:30)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.20 logs.
--------------------------------------------------------------------------------Apache Tomcat/5.5.20
下面是borrowdao.java:
package com.dao;import com.core.ConnDB;
import java.util.*;
import com.actionForm.BorrowForm;
import java.sql.*;
import com.actionForm.ReaderForm;
import com.actionForm.BookForm;
import java.util.Date;public class BorrowDAO {
    ConnDB conn = new ConnDB();
    public int insert() {
        String sql = "INSERT INTO tb_borrow (bookid) vlaues(1) ";
        int ret = conn.executeUpdate(sql);
        return ret;
    }
    //*****************************图书借阅******************************
    public int insertBorrow(ReaderForm readerForm,BookForm bookForm,String operator){
        //获取系统日期
        Date dateU=new Date();
        java.sql.Date date=new java.sql.Date(dateU.getTime());
       String sql1="select t.days from tb_bookinfo b left join tb_booktype t on b.typeid=t.id where b.id="+bookForm.getId()+"";
        ResultSet rs=conn.executeQuery(sql1);
        int days=0;
        try {
            if (rs.next()) {
                days = rs.getInt(1);
            }
        } catch (SQLException ex) {
        }
        //计算归还时间
          String date_str=String.valueOf(date);
          String dd = date_str.substring(8,10);
          String DD = date_str.substring(0,8)+String.valueOf(Integer.parseInt(dd) + days);
          java.sql.Date backTime= java.sql.Date.valueOf(DD);---36行
          String sql ="Insert into tb_borrow (readerid,bookid,borrowTime,backTime,operator) values("+readerForm.getId()+","+bookForm.getId()+",'"+date+"','"+backTime+"','"+operator+"')";
           int falg = conn.executeUpdate(sql);
          System.out.println("添加图书借阅信息的SQL:" + sql);
          conn.close();
          return falg;
}
      //*************************************图书继借*********************************
      public int renew(int id){
          String sql0="SELECT bookid FROM tb_borrow WHERE id="+id+"";
          ResultSet rs1=conn.executeQuery(sql0);
          int flag=0;
          try {
            if (rs1.next()) {
                //获取系统日期
                Date dateU = new Date();
                java.sql.Date date = new java.sql.Date(dateU.getTime());
                String sql1 = "select t.days from tb_bookinfo b left join tb_booktype t on b.typeid=t.id where b.id=" +
                              rs1.getInt(1) + "";
                ResultSet rs = conn.executeQuery(sql1);
                int days = 0;
                try {
                    if (rs.next()) {
                        days = rs.getInt(1);
                    }
                } catch (SQLException ex) {
                }
                //计算归还时间
                String date_str = String.valueOf(date);
                String dd = date_str.substring(8, 10);
                String DD = date_str.substring(0, 8) +
                            String.valueOf(Integer.parseInt(dd) + days);
                java.sql.Date backTime = java.sql.Date.valueOf(DD);                String sql = "UPDATE tb_borrow SET backtime='" + backTime +
                             "' where id=" + id + "";
                flag = conn.executeUpdate(sql);
            }
          } catch (Exception ex1) {}
          conn.close();
          return flag;
      }弄了很久了,一直出错,求大大们帮帮忙了

解决方案 »

  1.   

    String.valueOf(Integer.parseInt(dd) + days)看一下这个值是不是有问题
      

  2.   

    Integer.parseInt(dd) + days这个值为不合法的日期字符串。比如今天是2011-5-29  如何 days = 2的话, 这个表达式的值将为 2011-5-32 
    这个是无法转换的
      

  3.   


    Integer.parseInt(dd) + days这个值为不合法的日期字符串。比如今天是2011-5-29  如果 days = 3的话, 这个表达式的值将为 2011-5-32 
    这个是无法转换的
      

  4.   

    java.sql.Date.valueOf(Unknown Source)转换错误
      

  5.   

    你是为了计算到期日期,可以使用Calendar类来处理。
    Coder: Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    cal.add(Calendar.DAY_OF_MONTH, 3);//日期+3,如果需要后退,可以-3.具体的可看API
    Date date1 = cal.getTime();
    java.sql.Date backTime  = new java.sql.Date(date1.getTime());
      

  6.   

    兄弟不知道的方法就看下API吧,你这个错误就是因为参数不合规定才抛出的!
    它这里面要传的参数是表示"yyyy-MM-dd"的形式日期字符串。
    你看下你的参数是怎样的!以下是API的方法说明:
    public static Date valueOf(String s)将 JDBC 日期转义形式的字符串转换成 Date 值。 参数:
    s - 表示 "yyyy-mm-dd" 形式的日期的 String 对象 
    返回:
    表示给定日期的 java.sql.Date 对象 
    抛出: 
    IllegalArgumentException - 如果给定日期不是 JDBC 日期转义形式 (yyyy-mm-dd)那么现在你就应该怎样改了!
      

  7.   

    这本书的内容我刚刚学习,也遇到的这个的问题,解决了。
    虽然回复了迟了点,也分享下吧。String sql1="select t.days from tb_bookinfo b left join tb_booktype t on b.typeid=t.id where b.id="+bookForm.getId()+"";
            ResultSet rs=conn.executeQuery(sql1);
            int days=0;
            try {
                if (rs.next()) {
                    days = rs.getInt(1);
                }
            } catch (SQLException ex) {
            }这是楼主的部分代代码//在计算归还时间  这个标注上面。
    首先:String sql1="select t.days from tb_bookinfo b left join tb_booktype t on b.typeid=t.id where b.id="+bookForm.getId()+"";
    这条MySQL语句先是通过b.id(书的id)在bookinfo表中查询typeid(书的类型id).再通过typeid在表booktype中查询typeid对应的days参数的值,就是可借天数。
    然后:days = rs.getInt(1);
    这个语句是把booktype表中对应typeid第一列参数返回给rs结果集。而写这程序的人的意思是把第三列的参数days的值赋给days。
    所以只要把1改成3,程序就可以了。
    不知道为什么教程附带的源码会有这样的错误。