简体   繁体   中英

java.lang.NullPointerException while trying to fetch data from database

I wanted to list the tags stored in the database in the following jsp page :

<div id="site_content"> <%-- Put the tags under this tag --%>
        <%! 
            GetTagsFromDatabase gtfd = new GetTagsFromDatabase();
            String tags[] = gtfd.getTags();
        %>

        <% 
            for(int i = 0 ; i <= tags.length ; ) {
        %>
        <table>
            <tr>
                <td> <%= tags[i++] %>   </td>
                <td> <%= tags[i++] %> </td>
                <td> <%= tags[i++] %> </td>
                <td> <%= tags[i++] %> </td>
            </tr>
        </table>
                <% } %>            
    </div>

Follwoing is GetTagsFromDatabase file :

package NonServletFiles;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;
import javax.naming.*;

public class GetTagsFromDatabase {

public GetTagsFromDatabase() {

}

public String[] getTags() {

    String tags[] = null;
    try {
        Context context = new InitialContext();

        DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/photog");

        Connection connection = ds.getConnection();
        String sqlQuery = "select NAMEOFTHETAG from tagcollection";
        PreparedStatement statement = connection.prepareStatement(sqlQuery);
        ResultSet set = statement.executeQuery();

        int i = 0;
        while(set.next()) {
            tags[i] = set.getString("NameOfTheTag"); // <<--- line 33
            System.out.println(tags[i]);
            i++;
        }
    }catch(Exception exc) {
        exc.printStackTrace();
    }

    return tags;
}  

}

But when i run the jsp page i get the following exceptions :

SEVERE: java.lang.NullPointerException
at NonServletFiles.GetTagsFromDatabase.getTags(GetTagsFromDatabase.java:33)
at org.apache.jsp.ListTags_jsp.<init>(ListTags_jsp.java:13)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:203)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)

SEVERE:     at NonServletFiles.GetTagsFromDatabase.getTags(GetTagsFromDatabase.java:33)
SEVERE:     at org.apache.jsp.ListTags_jsp.<init>(ListTags_jsp.java:13)
SEVERE:     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
SEVERE:     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
SEVERE:     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
SEVERE:     at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
SEVERE:     at java.lang.Class.newInstance0(Class.java:372)
........

I tried both the lookup urls java:comp/env/jdbc/photog and jdbc/photog . Though there are 48 items in the table,what could be the reason i get these exceptions ?

Your tags array is always null . You need to initialize it. Better is using an ArrayList that can store a variable length of tags. Instead of

String tags[] = null;

do this

ArrayList<String> tags = new ArrayList<String>();

and later:

tags.add(set.getString("NameOfTheTag"));

Then you need either to change your method signature from

public String[] getTags() {

to

public ArrayList<String> getTags() {

or convert your ArrayList to an array again.

If you know how many tag entries you have then you can just change that line:

String tags[] = new String[numberOfTagElements];

EDIT

In order to use an array you have to

  1. declare it
  2. initialize it
  3. add or set elements in that array.

Example:

String[] tags;  //declaration
tags = new String[10]; //initialize array: max 10 elements can be used.
tags[0] = "hello";  //set element 1 of your array

You missed step 2. No memory will be allocated if you init your array with null. You have to tell the compiler how much memory you need. If you want to use 10 elements for instance the array has to reserve that fist before you can use it.

My statement is generic but It helps you.

Whenever you encounter an Object,Why don't you check for null.

if(object==null){
//dosomething
}else{
//dosomethingelse()
}

I mean to say incorporate defensive programming into your code that helps you everytime.

take care of what @juergen d told.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM