2016-06-30 34 views
0

我有一个ArrayList类作为成员变量如何在构建方法中将值赋给Java类的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); 

    } 
} 

因此,当我创建瓷砖对象我想要设置的上,右,下,左值到4对象阵列用于瓷砖类。通过上面的代码,我从NetBean得到一个错误,“可能的方面可能尚未初始化”。我不确定这是什么意思,因为我试图用构建方法初始化它。

从NetBean寻求帮助最终得到了以下错误。

this.sides.set(0, up); 

我是新来的Java,所以如果有人能提供一些我在找上我无法理解的概念有些指令。

谢谢

+0

“初始化”一个变量意味着给它赋值(用'=')。由于'sides'没有被设置,所以调用'.add()'是没有意义的。 – dimo414

+0

谢谢dim414 无论谁投下我的问题,谢谢。正如我所说,我是新手。 – JamesA

+0

这个问题很清楚,imo +1。 – kazenorin

回答

3

你有这已经说明你的问题的消息variable sides might not have been initialized。您必须首先初始化边阵列列表。

像这样:

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

解决方案

修改:

private final ArrayList<Integer> sides; 

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

原因

Java不自动初始化变量,对你来说,sides仍然初始化(如null)当您试图.add的东西给它。

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

  1. 你有在side 变量与final关键字final关键字确保他们只会建设/声明期间被分配恰好一次。如果不这样做将导致编译错误:“variable yourVarNameHere might not have been initialized

  2. 您在构造函数中使用 这side更多的是语义问题。您会注意到,如果删除final关键字,但错误消失,但在执行程序时会遇到NullPointerException。原因在于我的第一段:sides仍然是未初始化的(如null)当你试图.add东西给它。

0

需要初始化为sides对象:

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

The reason its failing is that you have never initialized sides list.

这基本上有getter或init块的优点。我可以看到在几个地方这样的问题,所以刚刚上市了所有的更好的地方来初始化这些变量:

因此而不是调用变量直接与消气

this.sides.add(up); 

你可以有双方一个getter这样

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()。add(up);

2.初始化块

初始化块是在每一个构造之前,那叫一个。所以万一你有多个重载的构造函数。你只能有一个初始化块这样的:

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

3.定义,同时声明

您还可以在声明本身的时间定义象下面这样的变量:

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

4.构造函数

不建议在多个构造的情况下RS,但仍然可以在每个构造这样

 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()方法把它定义

您也可以创建自己的init方法来initalize所有这些变量并调用它在每一个重载的构造像如下:

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

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

希望能帮到你。

+0

我不知道谁低估了这个...但是它很好地分享原因,以便将来有一个改进的空间。提前致谢。 –

+1

我同意,我想也许是同一个人投下我的问题。 – JamesA

相关问题