【问题标题】:how to solve java.lang.NullPointerException for array assignment如何解决数组赋值的 java.lang.NullPointerException
【发布时间】:2020-07-26 12:55:08
【问题描述】:

我正在尝试将 SQL 结果中的变量分配给数组元素,但它一直显示 java.lang.NullPointerException。我试图声明上面的数组,但它似乎不起作用。异常没有显示错误所在的行,但是我编写了打印语句来找出异常位置,然后我发现当我打印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); }
        }
    }

【问题讨论】:

  • 您忘记拨打initialize()了吗?您确定有与该查询匹配的行吗?
  • 您是否在 while 循环之前实例化了您的活动数组?看起来您对代码进行了 sn-ped... 如果您可以编辑此问题并将 main 方法与所有相关调用包括在内,以及您在 while 循环中使用的变量的任何初始化,那么准确回答会更容易.
  • @Savior 我打电话给initialize() 并且有匹配的行。当我打印出name 时,它有一个值,但是当我打印出activity[i] 时,它等于null
  • @ZachRieck 我根据需要编辑了代码。
  • 您必须提供minimal reproducible example

标签: java arrays nullpointerexception assign


【解决方案1】:

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

就您所遇到的问题而言,问题是您声明了一个私有字符串数组,并试图以另一种方法为其赋值。该数组使用默认值 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[] 都声明为静态数组。然后,您需要在 main 方法中创建一个对象来调用您的值。您的更改将如下所示:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2021-01-09
    • 2012-05-14
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多