【问题标题】:Initialize Arraylist in method [duplicate]在方法中初始化 Arraylist [重复]
【发布时间】:2015-05-29 14:57:18
【问题描述】:

以下问题。我有大量的ArrayList attributes(与Kreuzlagerort20kg等基本相同)。我不想在构造函数中初始化它们(注释掉的部分),而是在 fillLager() 方法中初始化它们,从而可以在构造函数中调用该方法,然后初始化并填充它们。如果我在代码中这样做,我总是会得到一个空指针异常。

是否有可能和/或在方法中初始化一个数组列表而不获取空指针?

import java.util.ArrayList;
public class Lager {
private ArrayList<Screws> KreuzLagerort20kg,KreuzLagerort50kg;

public Lager(){
        //KreuzLagerort20kg = new ArrayList<Screws>();
        //KreuzLagerort50kg = new ArrayList<Screws>();

        fillLager(1,KreuzLagerort20kg,20);
        fillLager(1,KreuzLagerort50kg,50);
}

public void fillLager(int typ,ArrayList<Screws> lager,double lagerGewicht){

     lager = new ArrayList<Screws>();

     // code that loops through combinations and adds them to the arraylist
    }}}}}}

【问题讨论】:

  • 老实说,您注释掉的 2 行没有任何问题。
  • @vikingsteve 我什至认为这是一种很好的做法

标签: java methods arraylist initialization


【解决方案1】:

您不能在传递给方法的变量上调用 new 并且仍然让调用方法引用原始变量,因为 Java 通过引用传递。当您调用 new X() 时,会有一个新的引用,而调用其他方法的方法将不知道该变量现在指向另一个引用...

例如

public void methodA() {
    String s = new String("AAAAA");
    methodB(s);
    System.out.println(s);
}

public void methodB(String referredString) {
    referredString = new String("BBBBB");
}

调用methodA 将打印“AAAAA”

你需要在构造函数中初始化,或者让方法返回你传入的变量...

public void methodA() {
    String s = new String("AAAAA");
    s = methodB(s);
    System.out.println(s);
}

public String methodB(String referredString) {
    referredString = new String("BBBBB");
    return referredString ;
}

现在调用 methodA 将打印“BBBBB”

或者 - 在任一方法之外声明字符串并且根本不传递它......例如

String s = new String("AAAAA");
public void methodA() {
    methodB();
    System.out.println(s);
}

public void methodB() {
    s = new String("BBBBB");
}

也会产生“BBBBB”

【讨论】:

    【解决方案2】:

    你可以这样做: 不是在构造函数中正常初始化它(如KreuzLagerort20kg = new ArrayList&lt;Screws&gt;();),而是在fillLager中进行。

    import java.util.ArrayList;
    public class Lager {
    private ArrayList<Screws> KreuzLagerort20kg,KreuzLagerort50kg;
    
    public Lager(){
            //KreuzLagerort20kg = new ArrayList<Screws>();
            //KreuzLagerort50kg = new ArrayList<Screws>();
    
            fillLager(1, 20);
            fillLager(1, 50);
    }
    
    public void fillLager(int typ, int code){
         if (code==20){
             KreuzLagerort20kg = new ArrayList<Screws>();
         }
         if (code==50){
             KreuzLagerort50kg = new ArrayList<Screws>();
         }
    
    
         // code that loops through combinations and adds them to the arraylist
        }}}}}}
    

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 2011-05-11
      • 2011-02-15
      • 1970-01-01
      • 2016-01-29
      • 2012-04-30
      • 1970-01-01
      • 2018-07-27
      • 2011-08-30
      相关资源
      最近更新 更多