как решить java .lang.NullPointerException для назначения массива - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь присвоить переменную из 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); }
        }
    }

1 Ответ

0 голосов
/ 15 апреля 2020

Лично я бы предложил использовать ArrayList вместо массива для этого, но это всего лишь личные предпочтения. Вот статья о том, что https://www.w3schools.com/java/java_arraylist.asp

Что касается проблемы, то у вас проблема в том, что у вас есть объявленный массив частных строк, и вы пытаетесь присвоить ему значения в другой метод. Массив заполняется значениями по умолчанию null, так как это массив String. Причина, по которой вы получаете исключение, заключается в том, что он возвращает это значение по умолчанию, а не назначенное вами значение.

Вы все еще можете использовать закрытый массив, но вы захотите объявить его как stati c и использовать метод stati c для добавления значения к нему. Таким образом, когда вы добавите значение к нему, оно будет возвращаться так, как вы ожидаете. Это гораздо более простой пример, но он показывает, как этого добиться:

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]);
}
}

Что касается заданного вами c кода, я бы предложил объявить и Activity [], и ActivityID [] как массивы stati c , Затем вам нужно будет создать объект в вашем основном методе для вызова вашего значения. Ваши изменения будут выглядеть так:

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

Затем в вашем основном методе добавьте:

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

Это даст вам желаемый результат. Я бы также предложил переименовать ваш метод, который вы назвали так же, как ваш класс.

...