【问题标题】:java.lang.NullPointerException even though it's instanciated as global var [duplicate]java.lang.NullPointerException 即使它被实例化为全局变量 [重复]
【发布时间】:2021-12-27 09:59:54
【问题描述】:

我的问题通常很容易,但我只是看不出问题出在哪里。 -我将一个类的数组声明为一个全局变量,我在这个其他类中的多个函数中重用它。 实例化的类是:

 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)'''

提前谢谢你!!

【问题讨论】:

  • 那么第 195 行是哪一行? (我还强烈建议您开始遵循 Java 命名约定,例如 getNamesOfServices - 或者只是 getServiceNames 而不是 getnamesofservices,以及比 java_db 更好的名称。
  • new Service[10] 意味着您分配一个由 Service 实例组成的 10 元素数组,这些实例最初是 null,但这并不意味着您初始化每个元素,因此所有分配后的元素是null。说真的,为什么不先调试它并正确初始化数组呢?

标签: java class pointers netbeans


【解决方案1】:
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;

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    相关资源
    最近更新 更多