说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

这个错误是为什么?

编辑:说三道四文库 发布时间:2018-06-25 03:04
HTML文档下载 WORD文档下载 PDF文档下载
错误信息:
   java.lang.NullPointerException
at _index_22d1__jsp._jspService(/index-1.jsp:43)
at com.caucho.jsp.JavaPage.service(JavaPage.java:74)
at com.caucho.jsp.Page.subservice(Page.java:485)
at com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:179)
at com.caucho.server.http.Invocation.service(Invocation.java:288)
at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:132)
at com.caucho.server.http.ServletServer.serviceTop(ServletServer.java:937)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:213)
at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:158)
at com.caucho.server.TcpConnection.run(TcpConnection.java:140)
at java.lang.Thread.run(Thread.java:479)
是空指针
空值错误,检查
空指针异常。某个对象的值为 null,但是你使用了它就会出现这样的异常。如下:
String str = null;
System.out.println(str.length()); // str 为null, 出现空指针异常。

修改如下:

 if(str != null){
   System.out.println(str.length());
 }
空指针,你有个对象尚未初始化。
空值错误
我的程序是这样写的:
test.chatreg conn=new test.chatreg(); 
String sql="SELECT au_id  FROM authors "; 
ResultSet rs = null;
rs = conn.myexecuteQuery(sql);

test.chatreg:
package test;
import java.io.*;
import java.sql.*;
import java.util.*;


public class  chatreg{
Connection conn = null;
ResultSet rs = null;
Statement stmt;

public chatreg() {
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; 
String user="sa"; 
String password=""; 
conn= DriverManager.getConnection(url,user,password);
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
}
catch(java.lang.ClassNotFoundException e) {
System.err.println("chatreg(): " + e.getMessage());
}
catch(java.sql.SQLException e) {
System.err.println("chatreg(): " + e.getMessage());
}
}


public ResultSet myexecuteQuery(String sql) {
try {  
ResultSet rs=stmt.executeQuery(sql);
}
catch(SQLException ex) { 
System.err.println("aq.executeQuery: " + ex.getMessage());
}

return rs;
}
}
test.chatreg conn=new test.chatreg(); 
String sql="SELECT au_id  FROM authors "; 
ResultSet rs = null;
rs = conn.myexecuteQuery(sql);
后面的取值代码呢?
public ResultSet myexecuteQuery(String sql) {
try {  
ResultSet rs=stmt.executeQuery(sql);  // 这里有问题,将 ResultSet 去掉, rs 已经定义了,不需要重新定义。
}
catch(SQLException ex) { 
System.err.println("aq.executeQuery: " + ex.getMessage());
}

return rs; // 如果前面的ResultSet没有去掉,那么这里的rs并不是前面的rs。
}
同意楼上的观点。
Apollo47(阿波罗) :
   按你的方法做了,已经可以了~~!多谢~~~!

有一点我还是不明白为什么!在函数myexecuteQuery中的rs与全局变量中的rs虽然是不同,但我在jsp中调用了函数myexecuteQuery,返回的结果集应该不受影响啊~!!
我的理解是这个东西有点像指针的味道,里面是局部变量,虽然你返回了,但是除了这个函数这个变量就没有意义了,那你用这个地址里东西也就没有意义了

不知道对不对,希望高手来说明一下!呵呵
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘