Connection。createStatement()抛出 java.lang.NullPointerException 请大家帮忙
我在将该代码放到另一台电脑中时,原来运行正常的代码在另一台机器中java.sql.Connection.createStatement() 方法竟然抛出了 java.lang.NullPointerException 异常。在JDK 帮助文档中没有找到抛出的原因。
两台机器使用同样的 WebLogic10.3 版本 ,数据库连接也完全一样。使用同样的JNDI 配置信息,
其代码如下:
// DbConnect.java
package gov.revenue.harbin.foreignTrade.tools;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DbConnect {
private static String jndi = "mytest";
private static String host = "t3://localhost:7001";
private static DbConnect handl = null;
private static DataSource ds = null;
private boolean isCreateDataSource(String jndi,String host){
boolean flag = false;
if (ds != null){
flag = false;
} else {
Hashtable hsTable=null;
Context ctx=null;
Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
prop.put(Context.PROVIDER_URL, host);
try {
ctx = new InitialContext(prop);
ds = (DataSource)ctx.lookup(jndi);
flag = true;
} catch (NamingException e) {
e.printStackTrace();
}
}
return flag;
}
public Connection getConnection(){
Connection conn=null;
if(this.isCreateDataSource(jndi, host) == true){
try {
conn = ds.getConnection();
} catch (SQLException e) {
System.out.println("Get connection, process, or close statement exception: " + e.getMessage());
e.printStackTrace();
}
} else {
System.out.println("Get DataSource -->" + jndi + " Failed!");
}
return conn;
}
public boolean closeConnection (Connection conn,Statement stmt){
boolean flage = false;
if(stmt != null){
try {
stmt.close();
}
catch (Exception e) {
flage = false;
System.out.println("Close statement exception: " + e.getMessage());
}
// finally {
// stmt = null;
// }
}
if(conn != null){
try{
conn.close();
}
catch(Exception e){
flage = false;
System.out.println("Close connection exception: " + e.getMessage());
}
// finally {
// conn = null;
// }
}
return flage;
}
public static synchronized DbConnect init() {
if (handl != null) {
return handl;
} else {
handl = new DbConnect();
return handl;
}
}
}
// Testtime.java
package gov.revenue.harbin.foreignTrade.test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import gov.revenue.harbin.foreignTrade.tools.DbConnect;
public class Testtime {
private static String strSql = "";
public static String showTime (){
String result = "";
String strSql = " select sysdate d from dual ";
DbConnect db = DbConnect.init();
Connection con = db.getConnection();
Statement stmt = null;
try {
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(strSql);
rs.next();
result = (String)rs.getString("d");
System.out.println(strSql);
System.out.println(result);
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
db.closeConnection(con, stmt);
}
return result;
}
}
// index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="gov.revenue.harbin.foreignTrade.test.Testtime" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
This is time is <%=Testtime.showTime() %> <br>
</body>
</html>
--------------------编程问答-------------------- --------------------编程问答-------------------- conn为null吧! --------------------编程问答--------------------
mark
配置完全一样怎么会出错呢
帮顶下 --------------------编程问答-------------------- 数据库也有两个吗?如果没有两个数据库,
把jndi重配下。 --------------------编程问答-------------------- if(conn != null && !conn.isClose()){
conn.close();
}
感觉你Testtime()方法里有点问题,
问你,你的select sysdate d from dual 查的是什么,查出来是多少条记录,
那么你如此:
result = (String)rs.getString("d");
System.out.println(strSql);
System.out.println(result);
接受值输入对吗?
--------------------编程问答-------------------- 我用的是 oracle9i 的数据库,
但是已经通过 Connection con = db.getConnection(); 初始化了啊! --------------------编程问答-------------------- ResultSet rs = stmt.executeQuery(strSql);
rs.next();
result = (String)rs.getString("d");
Rs如果没有数据的话,你依然调用rs.getString肯定会出错。
最好是这样做
if(rs.next())
result = (String)rs.getString("d"); --------------------编程问答-------------------- 嗯,的确是,如果没有数据的确会出错,
可是我的测试 SQL 语句是 select sysdate d from dual 啊!
我觉得没有问题,但是控制台告诉我 java.sql.Connection.createStatement() 空指针异常,
问题还没解决,辛苦大家了! --------------------编程问答-------------------- Connection没取到吧。
在这下面打印下嘛:
try{
Connection con = db.getConnection();
if (con==null)
{
...
}
}catch... --------------------编程问答-------------------- 查下数据库包加入进去没有
补充:Java , Java EE