2014-02-23 17 views
0

当我尝试将数据添加到ArrayList时,我总是收到一个空点异常。我在网上看过,所有的答案都说确保你初始化ArrayList,但是我仍然得到一个空指针异常。有任何想法吗?ArrayList抛出空指针期望

package resources; 

import java.sql.*; 
import java.util.*; 
import java.io.*; 
import javax.naming.*; 
import javax.servlet.http.*; 

public class CoursesSupportBean 
{ 

    private String url; 
    private String DataSourceName; 
    String error; 
    private List<Object> allData = new ArrayList<Object>(); 

    public String course_name; 
    public int courseId; 
    Object obj=new Object(); 

    public CoursesSupportBean() { 
     url=""; 
     DataSourceName=""; 
     error=""; 
     allData = null; 
     course_name=""; 
     courseId=0; 
     obj=null; 
    } 


    public void setObj(Object obj) { 
     this.obj = obj; 
    } 
    public String getError() { 
     return error; 
    } 

    public void setUrl(String url){ 
     this.url = url; 
    } 

    public void setDataSourceName(String DataSourceName){ 
     this.DataSourceName=DataSourceName; 
    } 

    public List getDb_Data() 
    { 
     String framework = "embedded"; 
     String driver = "org.apache.derby.jdbc.EmbeddedDriver"; 
     String protocol = "jdbc:derby:"; 
     //HttpSession session = req.getSession(); 
     //String url = (String)session.getAttribute("url"); 
     //String DataSourceName = (String)session.getAttribute("DataSourceName"); 
     //res.setContentType("text/html"); 
     //PrintWriter out = res.getWriter(); 

     Context ctx = null; 
     java.sql.Connection conn = null; 
     Hashtable ht = new Hashtable(); 
     ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory"); 
     ht.put(Context.PROVIDER_URL,url); 
     ArrayList statements = new ArrayList(); // list of Statements, PreparedStatements 
     PreparedStatement psInsert = null; 
     PreparedStatement psUpdate = null; 
     Statement s = null; 
     ResultSet rs = null; 
     int i=0; 
     try 
     { 
      ctx = new InitialContext(ht); 
      try { 
       ctx.createSubcontext(DataSourceName); 
      } 
      catch (NameAlreadyBoundException e) { 
      // Subcontext already exists. 
      // Note that WebLogic's Context implementation does not throw this 
      // exception if the name is already bound to an identical object. 
      } 
      String dbName = "JHU"; 
      try { 
       javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup(DataSourceName); 
       conn = ds.getConnection(); 
       conn.setAutoCommit(false); 
       s = conn.createStatement(); 
       statements.add(s); 
      } 
      catch (SQLException e) { 
       System.out.println("----- SQLException -----"); 
       System.out.println(" SQL State: " + e.getSQLState()); 
       System.out.println(" Error Code: " + e.getErrorCode()); 
       System.out.println(" Message: " + e.getMessage()); 
      } 
     } 
     catch (NamingException e) { 
      System.out.println("Naming Exception"); 
     } 
     try 
     { 
      rs = s.executeQuery("SELECT * FROM COURSES"); 
      if (rs == null) 
      { 
       System.out.println("No rows in ResultSet"); 
      } 
      while (rs.next()) 
      { 
       DataFields d=new DataFields(rs.getInt(1), rs.getString(2));      
       System.out.println("Course data: "+ rs.getInt(1) + " " + rs.getString(2)); 
       this.allData.add(i,d); 
       i++; 
      } 
     } 
     catch (SQLException e) { 
      System.out.println("----- SQLException -----"); 
      System.out.println(" SQL State: " + e.getSQLState()); 
      System.out.println(" Error Code: " + e.getErrorCode()); 
      System.out.println(" Message: " + e.getMessage()); 
     } 
     try { 
      if (rs != null) { 
       rs.close(); 
       rs = null; 
      } 
     } catch (SQLException e) { 
      System.out.println("----- SQLException -----"); 
      System.out.println(" SQL State: " + e.getSQLState()); 
      System.out.println(" Error Code: " + e.getErrorCode()); 
      System.out.println(" Message: " + e.getMessage()); 
     } 

     // Statements and PreparedStatements 
     int c=0; 
     while (!statements.isEmpty()) { 
      // PreparedStatement extend Statement 
      Statement st = (Statement)statements.remove(c); 
      try { 
       if (st != null) { 
        st.close(); 
        st = null; 
       } 
      } catch (SQLException e) { 
       System.out.println("----- SQLException -----"); 
       System.out.println(" SQL State: " + e.getSQLState()); 
       System.out.println(" Error Code: " + e.getErrorCode()); 
       System.out.println(" Message: " + e.getMessage()); 
      } 
     } 

     //Connection 
     try { 
      if (conn != null) { 
       conn.close(); 
       conn = null; 
      } 
     } catch (SQLException e) { 
      System.out.println("----- SQLException -----"); 
      System.out.println(" SQL State: " + e.getSQLState()); 
      System.out.println(" Error Code: " + e.getErrorCode()); 
      System.out.println(" Message: " + e.getMessage()); 
     } 
     return this.allData; 
    } 
    public int getCourseId() 
    { 
     this.courseId=((DataFields)obj).courseId; 
     return this.courseId; 
    } 
    public String getCourse_Name() { 
     this.course_name=((DataFields)obj).course_name; 
     return this.course_name; 
    } 

    public class DataFields 
    { 
     public String course_name; 
     public int courseId; 

     public DataFields(int courseId, String course_name) 
     { 
      this.courseId=courseId; 
      this.course_name=course_name; 
     } 
    } 

} 

登录猫错误

在resources.CoursesSupportBean.getDb_Data(CoursesSupportBean.java:109)显示java.lang.NullPointerException

+1

放入包含堆栈跟踪的完整异常,并说明代码中的哪一行对应于堆栈跟踪中的哪一行。 –

+0

应该是更具体一点。 this.alldata.add(i,d);是抛出异常的线。这是109线。我已经尝试过,并与“这个”。描述符。 – user3344646

+2

请*编辑*的问题,而不是发布5 stacktrace评论! – andyb

回答

2

该ArrayList由定义初始化作为一个字段,在这里:

private List<Object> allData = new ArrayList<Object>(); 

但你似乎在构造函数在这里设置非常相同的ALLDATA为null:

public CoursesSupportBean() { 
    url=""; 
    DataSourceName=""; 
    error=""; 
    allData = null; 
    course_name=""; 
    courseId=0; 
    obj=null; 
} 

所以你得到一个空指针异常,因为你设置的ArrayList参考ALLDATA已经被初始化再次空(不再指向所创建的ArrayList)

只是删除这一行:

allData = null; 

通常情况下,您初始化在构造函数中的所有成员,但共同的初始化选择通常留在字段定义中,除非它是一个昂贵的操作,因此尽可能延迟。

3

您设置allDataArrayListnull在构造函数中。删除此行:

allData = null; 

从那里。通常,如果要在构造函数中初始化变量,只需在构造函数外部的类中声明它们,并仅在构造函数中初始化它们。换言之,代替上面allData = null;符合:

allData = new ArrayList<Object>(); 

替换构造的外这一行:

private List<Object> allData = new ArrayList<Object>(); 

与此:

private List<Object> allData;