Null pointer exception

D

dschectman

I get a stange NullPointerException in getClass().getName(). The code
below is running on Iplanet app server 6.5 running on windows 2000.
The datasource is defined by an app server connection pool.

Here is the code
package helper;

import org.apache.log4j.Category;
import java.sql.*;

// This class gets an connection to the datasource
public class DBConnectionHelper
{
Category loggerObj = Category.getInstance(("DBConnectionHelper");
Connection conn = null;
com.netscape.server.jdbc.ConnectionProxy csproxy = null;

public DBConnectionHelper()
{
}

public Connection getDBConnection() {
return getDBConnection("defaultdb");
}
public Connection getDBConnection(String connName)
{
Connection csproxyconn = null;
try
{
loggerObj.info("getting connection");
// Get a connection to the datasorce
conn = new helper.DBConnectionManager().getDBConnection(
connName);
loggerObj.info("Got connection");
loggerObj.info(conn); // The funny thing is that this line logs a
valid class (com.netscape.server.jdbc.ConnectionProxy@1a4bd4)
loggerObj.info(conn.getClass()); // Yet this line throws a
NullPOinterException as if conn was null
loggerObj.info(conn.getClass().getName());
String className = conn.getClass().getName();
loggerObj.info("Connection class Name ->" + className);

//For Iplanet connection pool, convert to Oracle connection
if
(!className.equalsIgnoreCase("oracle.jdbc.driver.OracleConnection")) {
csproxy = (com.netscape.server.jdbc.ConnectionProxy) conn;
csproxyconn = csproxy.getConnection();
return csproxyconn;
}
}
catch (Exception ex) {
loggerObj.error("Exception caught");
loggerObj.error(ex.getMessage());
loggerObj.error(ex);
//loggerObj.error(ex.getMessage(), ex);
}

return conn;
}
}

The connection manager class is just a wrapper for getting the
connection. A configuration file identifies whether to get it from a
JNDI lookup or from Oracle.

public Connection getDBConnection(String connName)
{
loggerObj.info("in getDBConnection" + connName);
// Get the db configuration from the config file
DBConfig aDBConfig = DBConfig.getInstance();
OrderedHashMap lookupData = aDBConfig .getLookupData(DBConfig
..KEY_DBCONNECTION);
InitialContext initialContext = null;
Hashtable env = new java.util.Hashtable(1);
Connection conn = null;
String oracleUserName = null;
String oracleUserPassword = null;
String oracleTnsName = null;
String oracleDriverName = null;
String jndiLookupType = null;
String jndiName = null;
String jndiLookup = null;

if (lookupData != null)
{
OrderedHashMap dbLookupData = (OrderedHashMap) if
(dbLookupData != null) {
oracleUserName = (String) dbLookupData.get("username");
oracleUserPassword = (String) dbLookupData.get("password");
oracleTnsName = (String) dbLookupData.get("dburl");
oracleDriverName = (String) dbLookupData.get("driver");
jndiLookupType = (String)
dbLookupData.get("jndi_lookup_type");
jndiName = (String) dbLookupData.get("jndi_name");
jndiLookup = (String) dbLookupData.get("jndi_lookup");

try {
// To use Iplanet connection pooling
if ( (jndiLookup != null) &&
jndiLookup.equalsIgnoreCase("yes")) {
loggerObj.info("INSIDE Iplanet Connection Pool
getConnection(" +
jndiName + ")");
initialContext = new InitialContext(env);
DataSource ds = (javax.sql.DataSource)
initialContext.lookup(
jndiName);
conn = ds.getConnection();

// com.netscape.server.jdbc.ConnectionProxy csproxy =
(com.netscape.server.jdbc.ConnectionProxy)ds.getConnection();
//
System.out.println("csproxy.getConnection().getClass().getName(): " +
csproxy.getConnection().getClass().getName());
// conn = csproxy.getConnection();
// loggerObj.info("conn.getClass().getName()"
+conn.getClass().getName());

loggerObj.info("Completed Iplanet Connection Pool
getConnection(" +
jndiName + ")");
}
else { // To use Oracle connection pooling
loggerObj.info("INSIDE Oracle Connection getConnection("
+ connName +
")");
Driver d = (Driver)
Class.forName(oracleDriverName).newInstance();
conn = DriverManager.getConnection(oracleTnsName,
oracleUserName,
oracleUserPassword);
loggerObj.info("Completed Oracle Connection
getConnection(" +
connName + ")");
}
}
catch (SQLException e) {
loggerObj.error("Error in getting the NEW Connection " +
e.getMessage());
}
catch (NamingException e) {
loggerObj.error("Error in getting the NEW Connection " +
e.getMessage());
}
catch (Exception ex) {
loggerObj.error(ex.getMessage(), ex);
}
finally {
return conn;
}
} else loggerObj.error("dbLookupData is null");
} else loggerObj.error("lookupData is null");
return conn;
}

Here are the log files
[25/Jul/2005 10:01:37:2] info: [25 Jul 2005 10:01:37] getting
connection
[25/Jul/2005 10:01:37:2] info: [25 Jul 2005 10:01:37] INSIDE Iplanet
Connection Pool getConnection(jdbc/defaultdb)
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37] Completed Iplanet
Connecti
on Pool getConnection(jdbc/defaultdb)
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37] Got connection
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37]
com.netscape.server.jdbc.ConnectionProxy@1a4bd4
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37] Exception caught
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37]
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37]
java.lang.NullPointerException
 
J

John Currier

You're evidently throwing away your stack traces. I assume that your
logger can log an exception with stack traces, right? That extra piece
of info should significantly help isolate the problem.

IMHO normal code should not call Exception.getMessage().

John Currier
http://schemaspy.sourceforge.net
 
T

Thomas Fritsch

I get a stange NullPointerException in getClass().getName(). ...
How do you know that the NullPointerException happened in
getClass().getName()? I see no evidence for this in your material below.
Do you have an exception stack trace leading to that conclusion? Please
share that information with us. If you don't have a stack trace, let
your loggerObj print one. If the stack trace gives any line numbers,
please mark-up those lines in the posted source code.
... The code
below is running on Iplanet app server 6.5 running on windows 2000.
The datasource is defined by an app server connection pool.

Here is the code
[...code snipped...]
BTW: the line-wrapping makes the code very hard to read.
The connection manager class is just a wrapper for getting the
connection. A configuration file identifies whether to get it from a
JNDI lookup or from Oracle.
[...code snipped...]

Here are the log files
[25/Jul/2005 10:01:37:2] info: [25 Jul 2005 10:01:37] getting
connection
[25/Jul/2005 10:01:37:2] info: [25 Jul 2005 10:01:37] INSIDE Iplanet
Connection Pool getConnection(jdbc/defaultdb)
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37] Completed Iplanet
Connecti
on Pool getConnection(jdbc/defaultdb)
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37] Got connection
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37]
com.netscape.server.jdbc.ConnectionProxy@1a4bd4
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37] Exception caught
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37]
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37]
java.lang.NullPointerException
 
D

dschectman

Thanks for the replies. I added some more debugging to the code

loggerObj.info("Getting conn " + connName);
conn = new helper.DBConnectionManager().getDBConnection(connName);
loggerObj.info("Got it");
loggerObj.info(conn);
if (conn==null) throw new Exception("conn is null");
loggerObj.info(String.valueOf(conn.isClosed()));
loggerObj.info(String.valueOf(conn.getAutoCommit()));
loggerObj.info(conn.getClass());
String className = conn.getClass().getName();
loggerObj.info("Connection class Name ->" + className);

According to the log file, the exception occurs on conn.getClass() as
the booleans are recorded in the log file and the next entry is the
NullPointerException.

[25/Jul/2005 15:02:59:0] info: [25 Jul 2005 15:02:59] Got it
[25/Jul/2005 15:02:59:0] info: [25 Jul 2005 15:02:59]
com.netscape.server.jdbc.ConnectionProxy@11e831
[25/Jul/2005 15:02:59:0] info: [25 Jul 2005 15:02:59] false
[25/Jul/2005 15:02:59:0] info: [25 Jul 2005 15:02:59] true
[25/Jul/2005 15:02:59:0] error: [25 Jul 2005 15:02:59]
java.lang.NullPointerException

According to the stack trace the error occurred at line 29, which,
according to the editor, is
conn = new helper.DBConnectionManager().getDBConnection(connName);

[25/Jul/2005 15:02:59:0] error: [25 Jul 2005 15:02:59]
java.lang.NullPointerException
at helper.DBConnectionHelper.getDBConnection(
DBConnectionHelper.java:29)
at jsp.APPS.VxComponent.test._jspService(test.java:150)
at org.apache.jasper.runtime.HttpJspBase.service(Unknown
Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
com.netscape.server.servlet.servletrunner.ServletInfo.service
(Unknown Source)
at
com.netscape.server.servlet.servletrunner.ServletRunner.callJSP(Unknown
Source)
at
com.netscape.server.servlet.platformhttp.PlatformHttpServletResponse.
callJspCompiler(Unknown Source)
at
com.netscape.server.servlet.platformhttp.PlatformHttpServletResponse.
callUri(Unknown Source)
at
com.netscape.server.servlet.platformhttp.PlatformHttpServletResponse.
callUriRestrictOutput(Unknown Source)
at
com.netscape.server.servlet.platformhttp.PlatformRequestDispatcher.fo
rward(Unknown Source)
at com.netscape.server.servlet.jsp.JSPRunner.service(Unknown
Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at
com.netscape.server.servlet.servletrunner.ServletInfo.service(Unknown
Source)
at
com.netscape.server.servlet.servletrunner.ServletRunner.execute(Unknown
Source)
at com.kivasoft.applogic.AppLogic.execute(Unknown Source)
at com.kivasoft.applogic.AppLogic.execute(Unknown Source)
at com.kivasoft.thread.ThreadBasic.run(Native Method)
at java.lang.Thread.run(Thread.java:479)

Thomas said:
I get a stange NullPointerException in getClass().getName(). ...
How do you know that the NullPointerException happened in
getClass().getName()? I see no evidence for this in your material below.
Do you have an exception stack trace leading to that conclusion? Please
share that information with us. If you don't have a stack trace, let
your loggerObj print one. If the stack trace gives any line numbers,
please mark-up those lines in the posted source code.
... The code
below is running on Iplanet app server 6.5 running on windows 2000.
The datasource is defined by an app server connection pool.

Here is the code
[...code snipped...]
BTW: the line-wrapping makes the code very hard to read.
The connection manager class is just a wrapper for getting the
connection. A configuration file identifies whether to get it from a
JNDI lookup or from Oracle.
[...code snipped...]

Here are the log files
[25/Jul/2005 10:01:37:2] info: [25 Jul 2005 10:01:37] getting
connection
[25/Jul/2005 10:01:37:2] info: [25 Jul 2005 10:01:37] INSIDE Iplanet
Connection Pool getConnection(jdbc/defaultdb)
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37] Completed Iplanet
Connecti
on Pool getConnection(jdbc/defaultdb)
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37] Got connection
[25/Jul/2005 10:01:37:6] info: [25 Jul 2005 10:01:37]
com.netscape.server.jdbc.ConnectionProxy@1a4bd4
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37] Exception caught
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37]
[25/Jul/2005 10:01:37:6] error: [25 Jul 2005 10:01:37]
java.lang.NullPointerException
 
T

Thomas Fritsch

Thanks for the replies. I added some more debugging to the code

loggerObj.info("Getting conn " + connName);
conn = new helper.DBConnectionManager().getDBConnection(connName);
loggerObj.info("Got it");
loggerObj.info(conn);
if (conn==null) throw new Exception("conn is null");
loggerObj.info(String.valueOf(conn.isClosed()));
loggerObj.info(String.valueOf(conn.getAutoCommit()));
loggerObj.info(conn.getClass());
String className = conn.getClass().getName();
loggerObj.info("Connection class Name ->" + className);

According to the log file, the exception occurs on conn.getClass() as
the booleans are recorded in the log file and the next entry is the
NullPointerException.

[25/Jul/2005 15:02:59:0] info: [25 Jul 2005 15:02:59] Got it
[25/Jul/2005 15:02:59:0] info: [25 Jul 2005 15:02:59]
com.netscape.server.jdbc.ConnectionProxy@11e831
[25/Jul/2005 15:02:59:0] info: [25 Jul 2005 15:02:59] false
[25/Jul/2005 15:02:59:0] info: [25 Jul 2005 15:02:59] true
[25/Jul/2005 15:02:59:0] error: [25 Jul 2005 15:02:59]
java.lang.NullPointerException

According to the stack trace the error occurred at line 29, which,
according to the editor, is
conn = new helper.DBConnectionManager().getDBConnection(connName);

[25/Jul/2005 15:02:59:0] error: [25 Jul 2005 15:02:59]
java.lang.NullPointerException
at
helper.DBConnectionHelper.getDBConnection(DBConnectionHelper.java:29)
at jsp.APPS.VxComponent.test._jspService(test.java:150) [...]
at java.lang.Thread.run(Thread.java:479)
You actually have 2 (two!) NullPointerException's:
(1) one at line 29 in method getDBConnection() of the DBConnectionManager
(*not* DBConnectionHelper) class, as the exception stack trace shows
without doubt
(2) one near the place where you suspect it.But you decided to catch it
without printing the stack trace, thus ignoring the line numbers you
would get there

The reason behind that is probably your somewhat screwed (sorry!) design.
You actually have 2 different classes (DBConnectionHelper and
DBConnectionManager), both with a getDBConnection method.
In your DBConnectionHelper.getDBConnection method you create a new instance
of DBConnectionManager and call its getDBConnection method. O my
goodness....
You probably should redesign your code from scratch.
To make it clear, here is your current code with large parts stripped out:

public class DBConnectionHelper
{
[...]

public Connection getDBConnection(String connName)
{
[...]
conn = new helper.DBConnectionManager().getDBConnection( /*line 29*/
connName);
[...]
return conn;
}
}

Secondly: As John Currier has already recommended, you *really* should print
a stack trace in your catch clause. Look up the javadoc of class
org.apache.log4j.Category to find a method, which can take an Exception (or
Throwable) object as a parameter.
 
T

Thomas Fritsch

Thomas Fritsch said:
java.lang.NullPointerException
at
helper.DBConnectionHelper.getDBConnection(DBConnectionHelper.java:29)
at jsp.APPS.VxComponent.test._jspService(test.java:150) [...]
at java.lang.Thread.run(Thread.java:479)
You actually have 2 (two!) NullPointerException's:
(1) one at line 29 in method getDBConnection() of the DBConnectionManager
(*not* DBConnectionHelper) class, as the exception stack trace shows
without doubt
I was puzzled. Of course it is just the other way round:
(1) one at line 29 in method getDBConnection() of the DBConnectionHelper
(*not* DBConnectionManager) class, as the exception stack trace shows
without doubt
[...]
But the main issue still persists.
 
J

John Currier

According to the stack trace the error occurred at line 29, which,
according to the editor, is
conn = new helper.DBConnectionManager().getDBConnection(connName);

[25/Jul/2005 15:02:59:0] error: [25 Jul 2005 15:02:59]
java.lang.NullPointerException
at helper.DBConnectionHelper.getDBConnection(DBConnectionHelper.java:29)
at jsp.APPS.VxComponent.test._jspService(test.java:150)
at org.apache.jasper.runtime.HttpJspBase.service(Unknown Source)

That's not line 29 of your JSP. It's line 29 of
DBConnectionHelper.java.

I won't even comment on doing database manipulations directly in a
JSP...

John
http://schemaspy.sourceforge.net
 
D

dschectman

Thanks for the input. This code is from a production application that
we inherited. The same ambiguous code runs fine in production. I have
traced the porblem to my setup. I created a function that gets the
datasource with a JNDI lookup and prints the class associated with it.
1) If the object is cast to com.netscape.server.jdbc.ConnectionProxy,
getClass does not throw a null pointer exception
2) If the object is cast as Connection, getClass throws a null pointer
exception

The code compiles without any errors. This tells me that something is
wrong with the runtime classpath or the implementation of
com.netscape.server.jdbc.ConnectionProxy. The null pointer exception
may be related to a class cast exception between Connection and
com.netscape.server.jdbc.ConnectionProxy.

test.jsp:
<html>
<body>
Test datasource
<%
TestClass c = new TestClass();
c.foo();
%>
</body>
</html>

TestClass.java
import org.apache.log4j.Logger;
import java.sql.*;
import javax.naming.InitialContext;
import java.util.Hashtable;
import java.sql.SQLException;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.io.StringWriter;
import java.io.PrintWriter;

public class TestClass {
Logger loggerObj = getLogger("DBConnectionManager");
public void foo(String jndiName)
throws Exception
{
Hashtable env = new Hashtable();
InitialContext initialContext = new InitialContext(env);
loggerObj.info("in foo");
DataSource ds = (javax.sql.DataSource)
initialContext.lookup(jndiName);
loggerObj.info("got datasource");
Connection c =ds.getConnection();
com.netscape.server.jdbc.ConnectionProxy csproxy =
(com.netscape.server.jdbc.ConnectionProxy) ds.getConnection();
loggerObj.info("cl1 = " + csproxy.getClass().getName());
loggerObj.info("cl2 = " +
((com.netscape.server.jdbc.ConnectionProxy)c).getClass().getName());
loggerObj.info("cl2 = " + ((Connection)
csproxy).getClass().getName());
}
}
 
J

John Currier

I'm confused as to why you posted the code, but didn't post the stack
trace.

What you cast the connection to should not result in any change in the
behavior of getClass(). That cast is not changing anything related to
getClass().

Casting is usually a questionable thing to do. That is, you'd better
have a darn good reason for doing it.

With what you've given us to go on, I would bet that ds.getConnection()
is returning null.

John
http://schemaspy.sourceforge.net
 
D

dennishancy

I am having similar error messages that look like this:

java.lang.NullPointerException at euwPledge.doGet(Unknown Source) at
javax.servlet.http.HttpServlet.service(HttpServlet.java:787)

Being new to Java, I have a few questions:

- Does the 787 refer to a line number?
- What's the best way to begin debugging this?
- What other information can I post here that would help get to the
root of the problem?

The really odd part is that I had one occasion when the code worked as
it should. But that was only once. Not sure if that suggests a code
issue or a configuration issue?

Any suggestions as to what I can look into would be greatly
appreciated. Thanks.


Dennis Hancy
Eaton Corporation
Cleveland, OH
 
T

Tor Iver Wilhelmsen

- Does the 787 refer to a line number?
Yes.

- What's the best way to begin debugging this?

Look for uses of the . operator; something in front of a . is null.
Try adding some tests for null.
 
B

Babu Kalakrishnan

I am having similar error messages that look like this:

java.lang.NullPointerException at euwPledge.doGet(Unknown Source) at
javax.servlet.http.HttpServlet.service(HttpServlet.java:787)

Being new to Java, I have a few questions:

- Does the 787 refer to a line number?
- What's the best way to begin debugging this?
- What other information can I post here that would help get to the
root of the problem?

Yes - 787 indeed refers to a line number - but unfortunately it doesn't
tell you where the real problem lies - so no point starting your
debugging from there.

Make sure you compile the application with debugging informaton enabled.
If you're using plain javac for the compilation, the -g switch ought to
do it. If you're using an IDE, you'll need to find out the exact means
to enable it by looking at the documentation. (Most IDEs have it turned
on by default)

In any case, the "Unknown source" message generally means that that the
compilation was done with debugging set to none, and that's something
you don't ever want to do in the development phase of a project. (Very
similar to the try{..some code..} catch (Exception e) {} stuff you see
in a lot of code. In my view, if an exception occurred, you want to know
what it was and figure out why it occurred - no point hiding it)

BK
 
A

Andrea Desole

I am having similar error messages that look like this:

java.lang.NullPointerException at euwPledge.doGet(Unknown Source) at
javax.servlet.http.HttpServlet.service(HttpServlet.java:787)

Being new to Java, I have a few questions:

- Does the 787 refer to a line number?

yes (as everyone else said already)
- What's the best way to begin debugging this?

if you want to use a real debugger, that can be a bit difficult. You
basically have to debug the entire application server. I have never used
iPlanet, so I don't know how to do that exaactly. The easiest thing I
can recommend is to find in the documentation how to start iPlanet in
debug mode, or how to set the flags used by the server virtual machine
when it's started. If you don't know what flags to use, you can easily
find them in the JDK documentation (search for the Xdebug and Xrunjdwp
options for the java command). If you succeed in starting the virtual
machine with the debug options, you can attach a debugger to it. Which
debugger is your choice.
Anyway, for the moment I would use normal log messages, as you have been
doing so far.

- What other information can I post here that would help get to the
root of the problem?

1) John is right: a class cast doesn't affect the getClass method
2) I noticed that in the stack trace you have euwPledge.doGet, instead
of TestClass.foo. I also noticed that in your JSP you call c.foo()
instead of c.foo(String), which means you shouldn't even able to compile
your JSP

So, if I'm not missing anything, I think you should really look at your
code.
If I'm missing something (besides the fact that I would like to know
what) you can try to dump the following values:

((com.netscape.server.jdbc.ConnectionProxy)c).getClass()
c.getClass()

they should give you the same value
 
R

Roedy Green

In any case, the "Unknown source" message generally means that that the
compilation was done with debugging set to none, and that's something
you don't ever want to do in the development phase of a project.

Another explanation is that it occurred in Sun's code. You have to
look where you called sun's code. You likely passed it a null
parameter.

Someone pointed out recently that the JDK private JRE has debug turned
on and the public one has it turned off.
 
D

dennishancy

In my continued attempts to figure out what's wrong with this, I've
noticed something else.

If I am logged into my application, then I get that nullPointer java
error when I click on the link.

However, if I am Not logged in, and key in the URL of the link directly
into my browser, the information shows up as expected.

Not sure what this means, but thought it might be useful information in
trying to figure this out.

Something is being set when logging out that enables the link to work.
But what could that be??


Dennis
 
A

Andrea Desole

In my continued attempts to figure out what's wrong with this, I've
noticed something else.

If I am logged into my application, then I get that nullPointer java
error when I click on the link.

However, if I am Not logged in, and key in the URL of the link directly
into my browser, the information shows up as expected.

Not sure what this means, but thought it might be useful information in
trying to figure this out.

Something is being set when logging out that enables the link to work.
But what could that be??

If I'm not wrong this is the first time you mention log in and log out,
and a link. What's the value of the url of the link? How does the
application find out what the url is? And waht kind of information is
expected?
The information you gave is a bit incomplete and inconsistent. The
example you gave seems a good idea, but it just doesn't match. Even
assuming that this euwPledge you are calling is something internal in
iPlanet, you are still calling a method from your JSP that doesn't
exist. That might mean that you posted the wrong code, but also that you
have some problems with your classpath.
Maybe you should give one easy, clear, correct, readable piece of code,
with the necessary information.
And, to answer your last question: the way I look at it a relationship
with a log in/log out procedure looks unlikely, but, since I don't know
what is going on, I might (very roughly) guess that something is wrong
in processing some session scoped information that is added when someone
logs in, and is used to get the url that is used to build the link.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,832
Latest member
GlennSmall

Latest Threads

Top