请教各位:本菜完全照抄参考书(《开源编程精要15讲》第二章最后一个例子),用JDBC、Servlet和JSP,学着写了个有点MVC色彩的Web应用,其实就是一个网站登录功能啦。由login.jsp显示表单,用户填写后将数据转交给LoginSevlet(控制器),再转交给LoginHandler类验证,LoginHandler调用DBPool类查询数据库,验证用户名和密码是否正确,并返回查询结果。数据库是用ODBC下的Access,DBPool利用JDBC查询时的一些格式字符串放到了一个db.properties文件中。在Eclipse下运行时是没问题的,数据库查询和结果显示完全正常。只是当把这个项目发布到Tomcat下的时候,总是出现java.lang.NullPointerException异常,错误指向JDBC中的Connection对象,似乎这个数据库连接并没有正常建立,返回的是个null。这个我在Eclipse下调试的时候也遇到过,就是db.properties文件的路径没放对,放到正确的文件夹里就好了。db.properties文件的内容:DBDriver = sun.jdbc.odbc.JdbcOdbcDriver
Connection = jdbc:odbc:login
User =
Password =怀疑DBPool类有错误:public class DBPool {
String getPath() {
try {
String sDBDriver = null;
String sConnection = null;
String sUser = null;
String sPassword = null;

Properties p = new Properties();
InputStream is = getClass().getResourceAsStream("/db.properties");
p.load(is);
sDBDriver = p.getProperty("DBDriver", sDBDriver);
sConnection = p.getProperty("Connection", sConnection);
sUser = p.getProperty("User", "");
sPassword = p.getProperty("Password", "");

Properties pr = new Properties();
pr.put("user", sUser);
pr.put("password", sPassword);
pr.put("characterEncoding", "GB2312");
pr.put("userUnicode", "TRUE");

return sDBDriver;
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
//return "Error!";
}
}尤其是这一句:InputStream is = getClass().getResourceAsStream("/db.properties"); 是不是因为它的原因,在Tomcat下没能正确加载db.properties文件,导致连接不能建立?不过在网上搜了下,这个用法似乎又是没问题的。对了,我的Tomcat版本7.0,Eclipse版本3.6.1。还请各位不吝赐教!

解决方案 »

  1.   

    HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception java.lang.NullPointerException
    chapter2.last.LoginHandler.checkLogin(LoginHandler.java:24)
    chapter2.last.LoginServlet.doPost(LoginServlet.java:37)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    note The full stack trace of the root cause is available in the Apache Tomcat/7.0.11 logs.
    --------------------------------------------------------------------------------Apache Tomcat/7.0.11
      

  2.   

    java.lang.NullPointerException
    chapter2.last.LoginHandler.checkLogin(LoginHandler.java:24)LoginHandler的第  24行报NullPointerException自己调试一下吧。这种东西没什么好说的。
      

  3.   

    LZ 你要学会如何看错误信息,很明显你这里的错误是在chapter2.last.LoginHandler.checkLogin(LoginHandler.java:24)  你仔细看看LoginHandler.java这个类的24行,程序走到这里的时候才出现的空指针异常,你在这里做个断点,查看一下,到底是哪里有问题,无非就是检查一下参数的传递和结果的返回是否正常……
      

  4.   

    java.lang.NullPointerException 空指针很好定位的。自己调试下。
      

  5.   

    InputStream is = getClass().getResourceAsStream("/db.properties");这一句估计是有问题的,去年那个/试试
      

  6.   

    System.out.println()一下你获得的那些对象啊,你觉得可能的都输出一下就知道是不是null了,知道哪里null就知道哪里出问题了
      

  7.   

    看这里:Properties pr = new Properties();
    pr.put("user", sUser);
    pr.put("password", sPassword);
    pr.put("characterEncoding", "GB2312");
    pr.put("userUnicode", "TRUE");
    你这里的逗号(中文标点)我个人感觉看着比较别扭,和分号英文标点有差别,如果确实是这样,那问题就在这了,中英文标点要记得切换。
      

  8.   

    谢谢各位的热情回答。我说了这个程序在Eclipse下工作正常,只是发布到Tomcat下面才出现空指针导常Eclipse下没问题还有必要调试吗。发布到Tomcat下之后,都是.class文件怎么调试呢?还有我代码是直接拷贝出来的,标点都是西文的。西文标点,看上去像中文标点,那是CSDN字体的原因"/db.properties"这个路径表示class文件夹
      

  9.   

    要么是 db.properties 的路径问题,要么就你的配置出错了,应该检查下你的配置
    字符串,选中你写的字符串看看是否有多加的空格之类的
      

  10.   

    "/db.properties"这个路径表示classes文件夹下的db.properties文件继续求助。十分想知道各位有没有遇到过类似情况的,开发的时候好的,发布了之后不行
      

  11.   

    回10楼:发布了之后我也是把db.properties放在\Tomcat 7.0\webapps\项目名称\WEB-INF\classes文件夹下的。空格等多余字符也仔细检查过了,没问题
      

  12.   

    楼上的谢谢你。但我从你的回答看不到解决问题的方法想到一个可能的原因是,代码原作者用的Tomcat版本是5.5.9,我用的是7.0.1,会不会是因为这个原因,导致他写的代码不能在我的Tomcat上运行?实际上我确实把原作者的代码直接发布到Tomcat下面,错误提示完全一样。还是怀疑getResourceAsStream("/")这里的“/”并不是指Classes文件夹——至少对我的Tomcat7.0.1而言
      

  13.   

    一定是路径问题,InputStream is = getClass().getResourceAsStream("/db.properties");
    db.properties放在web-inf下试试
      

  14.   

    \Tomcat 7.0\webapps\项目名称\WEB-INF
      

  15.   

    在代码里加入一些trace重新编译一下再放到tomcat发布目录里去试试吧,这样应该能帮你定位到底是哪儿出的空指针
      

  16.   

    不明白你说的ecplise下能运行是什么意思,但是报的异常的却是你的servlet中出了问题,你用debug启动打断点走一下就知道是什么问题了,至于你说的什么property文件是不是里面配置的东西在你的servlet用够用到,看看那是不是没有取到文件中的内容
      

  17.   

    路径问题的话可以试试用
    getClass().getClassLoader().getResourceAsStream("db.properties");
    然后把db.properties放到classes下面
      

  18.   

    嗯,又做了点测试,应该可以排除db.properties文件的路径问题,因为我把该文件里的字符串直接写到源码里,还是一样的出错提示。写了使用ODBC数据源的小servlet,发布到tomcat下面,不能正常访问Access数据库。和我提问的这个程序一个,都是Eclipse下调试的时候能正确访问数据库,布了之后有问题问题应该集中在Tomcat下的程序访问ODBC数据源这方面。还想请问各位有没遇到过类似情况(Tomcat访问ODBC出错)。实在不能解决也没关系,换个数据库就是了。敬请指教!
      

  19.   

    应该是这个错误了:
    2011-09-28 14:00:57 Commons Daemon procrun stdout initializedError: java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
    Error: java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
    Error: java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
    Error: java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
      

  20.   

    web 里使用 Thread.currentThread().getContextClassLoader().getResourceAsStream
      

  21.   

    问题解决,结帖给分最终答案是,建数据源的时候不能用“用户DSN”,应该用“系统DSN”。其他全部木有错最后再次谢谢各位的热情回复