我能否在将对象与另一个数组进行比较时更改一个值?

3

我有一个对象,它有一个名字,String[]。还有另一个String数组,只存储主函数中该对象的名称(第一个参数)。

import java.util.*;
class Dice{
    public String [] side;
    public String name;

    public Dice (String n, String ... a){
        name = n;
        side = a;

    }

    //Setter and Getter name
    public String getName(){
        return name;
    }
    public void setName(String n){
        name = n;
    }
}

对象的参数在主类中设置。

Dice easy = new Dice("绿色:","脑子","脑子","脑子","脚印","脚印","霰弹枪");

字符串数组只存储名称Easy:

我正在尝试通过将它们传递到主方法中的方法来比较这两个数组。

//Removeing the 3 dice which were picked form the cup of the current player
public static Dice [] cup(Dice [] a , String [] b){
    Dice [] currentCup = new Dice[a.length];


    for (int i = 0; i < b.length; i++) {
        if (b[i] == a[i].getName()) {
            currentCup[i].setName("");
        }
    }

    return currentCup;
}

如果对象的名称等于字符串数组中的名称,则对象的名称应该为空字符串(" ")。

我遇到了一个错误。

Exception in thread "main" java.lang.NullPointerException

我知道在这里使用ArrayList更好,因为我可以使用 .remove(i, elem)。但我不知道如何将一个ArrayList传递给构造函数。

此外,这只是我使用数组进行练习。

结果应该是,如果Dice[].getName()等于“easy”,那个Dice对象的名称应该为空字符串" "。


1
这个问题有点令人困惑,但我会尽力帮忙。NullPointerException(简称NPE)意味着您正在尝试访问空对象引用的成员(方法或公共属性)。哪一行代码抛出了NPE?尝试使用调试器逐步执行代码以查看哪里为空。您的问题与设置和比较无关,您只是没有初始化所有内容。 - Taylor
@Taylor建议你找出NPE的来源,这绝对是你应该做的。此外,我注意到在你的cup方法中,你创建了一个新数组currentCup,然后返回它而没有修改它。这意味着它将只是一个全为null的数组。因此,在调试代码时要注意这个问题。 - Jordan
请阅读:https://dev59.com/GnVC5IYBdhLWcg3wqzLV+ - GhostCat
你的字符串比较也是错误的:https://dev59.com/DnRB5IYBdhLWcg3wyqEd - GhostCat
最后:请专注于提出 一个 问题。谈论“发生了一些 NPE”然后又问关于其他问题,这真的不是一个好的开端。请每个问题只提一个问题。对于关于“代码无法工作”的问题,请参见[mcve]。 - GhostCat
3个回答

1
cup方法中,返回值currentCup从未被赋值,因此它只是一系列null。您需要逐个初始化它的成员(例如,在for内部的第一个操作中执行currentCup[i] = a[i])。
该代码尝试对null执行操作,这通常是不可能的(根据操作而定)。在这种情况下,代码无法获取nullgetName:这将在运行时引发异常。
此外,如果ba更长,代码也会崩溃。
希望我有所帮助。

1
我知道在这里使用ArrayList会更好,因为可以直接使用.remove(i, elem)方法。但我不知道如何将ArrayList传递到构造函数中。
public Dice (String n, List<String> sideList){
    name = n;
    side = sideList.toArray(new String[sideList.size()]);

}

同时,您没有对下面的数组进行任何操作。

Dice [] currentCup = new Dice[a.length];

我强烈建议您自己运行代码。看起来您的代码没有达到您想要的效果。 :)

0

将它放在你的if in方法中:

if (b[i] == a[i].getName()) {
    a[i].setName("");
    currentCup[i] = a[i];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接