打印数组条目时出现空指针异常

psr*_*psr 2 java arrays jdbc nullpointerexception

我创建了一个类Test,它计算数据库中与用户id相对应的条目数(将每个条目称为电子邮件).我用作11120059id和数据库中对应的条目数是2. countMail函数的输出工作正常,但因为我从一个数组返回getMail()函数并将其带入新数组,它显示我的空指针异常.请帮助我卡在中间.代码是:

package src.service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import model.Email;
import model.User;

public class Test {

public int countMail(User user){

    try{

        Class.forName("com.mysql.jdbc.Driver").newInstance();

        // Get a connection to the database
        Connection myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chillmaarodb", "root", "rsystems");

        PreparedStatement myStatement = myConn.prepareStatement("select * from complaints where RID=? ORDER BY date desc");


        myStatement.setString(1, user.getId());

        ResultSet rs = myStatement.executeQuery();

        int count=0;

        while(rs.next())
        {
        count++;
        }

        return count;
    }

    catch(Exception e){
        e.printStackTrace();
    }

    return 0;

}

public Email[] getMail(User user){

    try{

        Class.forName("com.mysql.jdbc.Driver").newInstance();

        // Get a connection to the database
        Connection myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chillmaarodb", "root", "rsystems");

        PreparedStatement myStatement = myConn.prepareStatement("select * from complaints where RID=? ORDER BY date desc");


        myStatement.setString(1, user.getId());

        ResultSet rs = myStatement.executeQuery();

        Home home= new Home();

        int length = home.countMail(user);

        Email[] mail = new Email[length];

        int i=0;

        while(rs.next())
        {
        mail[i].setMessage((String) rs.getString(5));
        mail[i].setTitle((String) rs.getString(4)); 
        mail[i].setSender((String) rs.getString(2));
        mail[i].setReceiver((String) rs.getString(1));
        i++;
        }

        return mail;

        }
    catch (Exception e){

        e.printStackTrace();

    }

    Email[] dummyMail = new Email[1];

    return dummyMail;



}

public static void main(String[] args){

    Test test = new Test();

    User user = new User();

    user.setId("11120059");

    System.out.println(test.countMail(user));

    Email[] email = test.getMail(user);

    for (int i=0 ; i<test.countMail(user) ; i++){

        System.out.println(email[i].getSender());

    }


}

}
Run Code Online (Sandbox Code Playgroud)

输出是:

2 

java.lang.NullPointerException
    at src.service.Test.getMail(Test.java:73)
    at src.service.Test.main(Test.java:107)
Exception in thread "main" java.lang.NullPointerException
    at src.service.Test.main(Test.java:111)
Run Code Online (Sandbox Code Playgroud)

Tag*_*eev 6

在编写时Email[] mail = new Email[length];,创建一个包含空引用的给定长度的数组.您无法通过此命令自动为该阵列创建所有对象.添加mail[i] = new Email()声明:

    Email[] mail = new Email[length];

    int i=0;

    while(rs.next())
    {
    mail[i] = new Email(); // or use appropriate constructor parameters
    mail[i].setMessage((String) rs.getString(5));
    mail[i].setTitle((String) rs.getString(4)); 
    mail[i].setSender((String) rs.getString(2));
    mail[i].setReceiver((String) rs.getString(1));
    i++;
    }
Run Code Online (Sandbox Code Playgroud)

另请注意,在创建dummyMail数组时,它也是一个具有单null引号的数组,Email也不会在那里创建对象.可能你需要:

Email[] dummyMail = new Email[] {new Email()};
Run Code Online (Sandbox Code Playgroud)