'NullPointerException in conn = this.jdbcFactory.getConnection();

I am using Java 1.4 and tomcat v4.0.

This is the code in my Dao:

private DataSource jdbcFactory;
    
    

    public CommonDao() {
            Context c = null;
            if (this.jdbcFactory == null) {
                try {
                    c= new InitialContext();
                    Context envCtx = (Context)c.lookup("java:comp/env");
                    this.jdbcFactory = (DataSource)envCtx.lookup("jdbc/mydb");     
                } catch (NamingException e) {
                    e.printStackTrace();
                }
            } 
        }
    
    public String getParamValue(String param_name) throws SQLException, TestException {
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            String sqlString=null;
            String param_value = null;
            TestException fe = new TestException();
            
            sqlString = "SELECT PARAM_VALUE " +
                        "FROM SAMPLE_TBL " +
                        "WHERE PARAM_NAME = '" + param_name + "' " ;
            
            try {
                conn = this.jdbcFactory.getConnection();
                ps = conn.prepareStatement(sqlString);
                rs = ps.executeQuery();
                
                 while (rs.next()) {
                 param_value = rs.getString("PARAM_VALUE");
                }
            } catch(SQLException e){
                fe.setCallingObj("CommonDao.getParamValue");
                fe.setErrorCode(e.getErrorCode());
                fe.setErrorMessage(e.getMessage()); 
                fe.setStackTrace(e.getStackTrace());
                throw fe;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                rs.close();
                ps.close();
                conn.close();
            }
    
            return param_value;
            
        }

context.xml under META-INF:

<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Resource name="jdbc/mydb" global="jdbc/mydb" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
    url="jdbc:oracle:thin:@somesitexxx:xxxx:XXXXXX"
    username="someusername" password="somepass" maxActive="1000"
    maxIdle="1000" maxWait="500" />
</Context>

web.xml under WEB-INF:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app id="WebApp_ID">
    <servlet>
        <servlet-name>LoginController</servlet-name>
        <display-name>LoginController</display-name>
        <description></description>
        <servlet-class>com.Controller.LoginController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginController</servlet-name>
        <url-pattern>/LoginController</url-pattern>
    </servlet-mapping>
    <resource-ref>
        <res-ref-name>jdbc/rdcdb</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</web-app>

I am using ojdbc7-12.1.0.2.jar as well but included or not I am still getting the NPE in conn = this.jdbcFactory.getConnection();

this.jdbcFactory -> is also null when debugging.

Can you help me which part I miss?

EDIT: I have now upgraded to java 8 and tomcat 7 and used ojdbc7-12.1.0.2.jar. But I am still getting the NPE exception updated error stacktrace:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.driver.OracleDriver'
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1429)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at com.Dao.CommonDao.getParamValue(CommonDao.java:72)
    at com.Dao.CommonDao.checkAvailability(CommonDao.java:411)
    at com.Controller.LoginController.processRequest(LoginController.java:114)
    at com.Controller.LoginController.doGet(LoginController.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.driver.OracleDriver
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1420)
    ... 27 more
Apr 28, 2022 3:16:40 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [LoginController] in context with path [/BV_PROBE] threw exception
java.lang.NullPointerException
    at com.Dao.CommonDao.getParamValue(CommonDao.java:89)
    at com.Dao.CommonDao.checkAvailability(CommonDao.java:411)
    at com.Controller.LoginController.processRequest(LoginController.java:114)
    at com.Controller.LoginController.doGet(LoginController.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

It catches SQLException: Cannot load JDBC driver class 'oracle.jdbc.driver.driver.OracleDriver'



Solution 1:[1]

Assuming that that is the only constructor ...

If jdbcFactory is null, that means that in the following code:

try {
    c = new InitialContext();
    Context envCtx = (Context) c.lookup("java:comp/env");
    this.jdbcFactory = (DataSource) envCtx.lookup("jdbc/mydb");     
} catch (NamingException e) {
    e.printStackTrace();
}

either the second lookup call returned null or you threw and caught a NamingException. According to the Context javadocs, a lookup call may return null, it your application bound null to the name.


However ... on rereading your question, I noticed this:

I am using Java 1.4 and Tomcat v4.0.

These are truly ancient versions. Both are end-of-life. Tomcat 4 was end-of-life prior to 20121, and Java 1.4.2 in 2013. You are missing nearly 10 years worth of security patches.

And this:

I am using ojdbc7-12.1.0.2.jar

That is a driver for Java 7. I doubt that it will work with Java 1.4.

According to what I have read, you should be using an ojdbc.14 driver with Java 1.4. It is highly unlikely that you can find one that is compatible with a recent Oracle database.


1 - 2012 is when Tomcat 5 was officially end-of-life. The end-of-life for earlier versions was not formally announced. But the last patch release of Tomcat 4 was in 2009.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1