如何在构建方法期间为Java类的ArrayList成员变量赋值?

时间:2016-06-30 02:31:42

标签: java arraylist

我有一个带有ArrayList的类作为成员变量

public class Tile {
     private final String Name;
     private final ArrayList<Integer> sides;

     public Tile (String name, int up, int right,int down, int left){

        this.Name = name;
        this.sides.add(up);

    }
}

因此,当我创建Tile对象时,我想将up,right,down,left值设置为Tile Class的4个对象数组。使用上面的代码我从NetBean&#34获得错误;变量端可能尚未初始化&#34;。我不确定这意味着什么,因为我试图用构建方法初始化它。

寻求NetBean的帮助最终得到以下内容,这会得到同样的错误。

this.sides.set(0, up);

我是Java的新手,所以如果有人可以提供一些我正在寻找关于我未能理解的概念的指导。

谢谢

4 个答案:

答案 0 :(得分:3)

您收到的消息variable sides might not have been initialized已经解释了您的问题。您必须首先初始化sides数组列表。

像这样:

private final ArrayList<Integer> sides = new ArrayList<>();

或者在将对象添加到旁边列表之前的构造函数中,如下所示:

public Tile (String name, int up, int right,int down, int left){
    sides = new ArrayList<Integer>();
    this.Name = name;
    this.sides.add(up);
}

答案 1 :(得分:2)

解决方案

修改:

N    music/atmosphere-sad_clown_bad_dub_13-(rse0095)-bonus_dvd-2008-raceme N    music/blink-182 - California (2016) [V0] N    music/Vitalogy N    music/Pearl Jam - Ten (1991) [V0] N    music/Vs N    music/Pearl Jam - No Code N    music/Pearl Jam - Riot Act N    music/Pearl Jam - Transmission Impossible (Live) (2015) [MP3] N    music/Pearl Jam N    music/Binaural N    music/Yield N    music/Pearl Jam ~ Backspacer [V0]-2009 Y    music/Beastie Boys - The In Sound From Way Out! (V0) N    music/Beastie Boys - Licensed To Ill N    music/Paul's Boutique 20th Anniversary Remastered Edition [V0] Y    music/1992 - Check Your Head Y    music/Beastie Boys - Ill Communication N    music/Beastie Boys - Hello Nasty N    music/Beastie Boys - (2004) - To The 5 Boroughs [V0] N    music/Beastie Boys - The Mix-Up (2007) N    music/Highway 61 Revisited V0 Y    music/1997 - Live Between Us [V0] N    music/2006 - World Container [V0] N    music/The Tragically Hip - 2012 - Now For Plan A (MP3 V0) Y    music/Red Hot Chili Peppers - The Getaway (2016) [V0]

 private final ArrayList<Integer> sides;

原因

当您尝试向 private final ArrayList<Integer> sides = new ArrayList<>(); 填充内容时,Java不会自动为您初始化变量,sides仍然未初始化(如null)。< / p>

您可能会注意到, 总是必须在构造/声明时初始化变量,但您已经做了两件事,要求您初始化.add in你的代码:

  1. sides上有final个关键字 使用side关键字的变量可确保在构造/声明期间仅为 分配 。如果不这样做会导致编译错误:&#34; final&#34;

  2. 您在构造函数中使用variable yourVarNameHere might not have been initialized 这更像是一个语义问题。您会注意到,如果删除side关键字,错误就会消失,但在执行程序时会遇到final。我之所以这样做的原因正是我的第一段中的原因:NullPointerException当你试图sides填充它时,仍然未初始化(如null)。

答案 2 :(得分:0)

您需要初始化sides对象:

 private final ArrayList<Integer> sides = new ArrayList<Integer>();

答案 3 :(得分:-1)

  

失败的原因是你从未初始化双方名单。

这基本上是使用getter或init块的优点。我可以在几个地方看到这样的问题,所以只需列出所有更好的地方来初始化这些变量:

<强> 1。吸气剂

所以不要用

直接调用变量
this.sides.add(up);

你可以为这样的双方获得一个吸气剂

public getSides(){
if(this.sides == null){
this.sides = new ArrayList<Integer>();
}
//you can also add even more validations here before anyone access it
return this.getSides();
}

因此你可以添加像这样的值 。this.getSides()加(最高);

<强> 2。 Init Blocks

Init块是在每个构造函数之前调用的块。所以万一你有多个重载的构造函数。你可以只有一个这样的init块:

{
this.sides = new ArrayList<Integer>();
}

第3。在声明时定义

您也可以在声明本身时定义此类变量,如下所示:

private final ArrayList<Integer> sides = new ArrayList<Integer>();

<强> 4。构造

不建议在多个构造函数的情况下,但仍然可以在每个构造函数中定义它,如此

     public Tile (String name, int up, int right,int down, int left){
        this.sides = new ArrayList<Integer>();
        this.Name = name;
        this.sides.add(up);

    }

<强> 5。初始化方法

你也可以创建自己的init方法来初始化所有这些变量,并在每个重载的构造函数中调用它,如下所示:

public void init() {
this.sides = new ArrayList<Integer>();
}

然后在init块或构造函数中调用此函数。

希望对你有所帮助。