如何解决数组赋值的java.lang.NullPointerException



我试图将SQL结果中的一个变量分配给数组元素,但它一直显示java.lang.NullPointerException。我试图声明上面的数组,但它似乎不起作用。异常没有显示错误的行,但我写了print语句来找出异常的位置,然后我发现当我打印activity[i]的值时,它等于null

这是代码:

package main;
import java.awt.EventQueue;    
public class ACTIVITY {
private Connection con;
private Statement stm;
private String sql;
private ResultSet rs;
private static int c_id=-1;
private static int s_id=-1;
private int a_id=-1;
private String activity[]=new String[5];
private int activityID[] =new int[5];
public static JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ACTIVITY window = new ACTIVITY();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public ACTIVITY() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(null);
panel.setVisible(true);
try {
Class.forName("com.mysql.jdbc.Driver");
con= 
DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","****" , "********");
stm= con.createStatement();
sql="Select * from activity where sid="+s_id;
rs=rs=stm.executeQuery(sql);
String name=" ";int i=0;
while(rs.next()){
name=rs.getString("a_name");
a_id=rs.getInt("a_id");
activity[i]=name;//after this assignment it always equal null
activityID[i]=a_id;
i++;
}
//the rest of the code
con.close();
} catch(Exception e) {System.out.println(e); }
}
}

就我个人而言,我建议使用ArrayList而不是数组,但这只是我个人的偏好。这是一篇关于这个的文章https://www.w3schools.com/java/java_arraylist.asp

就问题而言,问题是您有一个声明的私有字符串数组,并试图在另一个方法中为其赋值。由于该数组是String数组,因此它使用默认值null填充。得到异常的原因是它返回的是这个默认值,而不是您指定的值。

您仍然可以使用私有数组,但您需要将其声明为静态,并使用静态方法向其添加值。这样,当您向其添加该值时,它将以您期望的方式返回。这是一个简单得多的例子,但展示了如何实现这一点:

public class Test {
private static String activity[] = new String[5];
public void addValue() {
activity[0] = "Yo";
}
public static void main(String[] args) {
Test test = new Test();
test.addValue();
System.out.println(activity[0]);
}
}

至于您的特定代码,我建议将activity[]和activityID[]都声明为静态数组。然后,您需要在主方法中创建一个对象来调用您的值。您的更改如下所示:

private static String activity[] = new String[5];
private int activityID[] =new int[5];

然后在你的主要方法中,添加:

window.initialize(); //where window is your class object you declared

那会得到你想要的结果。我还建议将您调用的方法重命名为与类相同的方法。