java.lang.NullPointerException 即使它被实例化为全局变量

java.lang.NullPointerException even though it's instanciated as global var

我的问题通常很简单,但我就是看不出问题出在哪里。 -我正在声明一个 class 的数组作为全局变量,我在另一个 class 中的多个函数中重复使用它。 class 实例化为:

 public class Service {
      int numticketsin;
            String name="mi";
            int[] perhour={0,0,0,0,0,0,0,0,0,0};
            
            int moyenneticketperday;
            int[] moyenneticketperdayperhour={0,0,0,0,0,0,0,0,0,0};
            public Service(){}
}

全局变量:

Service[] services=new Service[10];

我尝试填充数组的函数:

 public void getnamesofservices(){
        int x=0;
        Connection conn=db.java_db();
    
        try {   
             Statement stmt = conn.createStatement();
            
                String qry = "SELECT  service_name from service ";
 
                ResultSet rs = stmt.executeQuery(qry);
                int i=0;
                while (rs.next()) {
                        String namee=rs.getString("service_name");
                        System.out.println(namee);

                        services[i].name = namee;
                   i++;
                }
                conn.close();
                
        }
        catch (SQLException ex)
            {
            System.err.println("SQLException: " + ex);
        }
        
    }

错误:

''' Exception in thread "main" java.lang.NullPointerException: Cannot assign field "name" because "this.services[i]" is null
    at com.mycompany.stats.NewJFrame.getnamesofservices(NewJFrame.java:195)
    at com.mycompany.stats.NewJFrame.<init>(NewJFrame.java:122)
    at com.mycompany.stats.Main.main(Main.java:16)'''

提前致谢!!

Service[] services=new Service[10];

这意味着您创建了包含 10 个位置的数组,但所有这些位置都是空的(这意味着它们在数组的每个位置中都有 null)。

因此,当尝试 services[i].name 时,您会得到 NullPointerException,因为 services[i]null

有很多方法可以进行初始化,这取决于您的业务案例。但仅举出两种可能性:

  1. 在声明处初始化它:
Service services[] = new Service[] { 
   new Service(),new Service(), new Service(), new Service(),new Service(),
   new Service(),new Service(), new Service(), new Service(),new Service()
};
  1. 或者在使用它之前,以防你没有覆盖它:
services[i] = new Service();
services[i].name = namee;