我正在为游戏制作牌组和牌级,并且在创建和使用字符串数组时遇到错误。 我的代码看起来像这样:错误是从底部开始的4行,它表示字符串undealt = ... undealt [0],它表示“需要数组,但发现了java.lang.String”,现在我很困惑
import java.util.*;
public class Deck
{
private static int currentCard = 0;
public ArrayList<Card> deck;
private String rank;
private String suit;
private String[] undealt = new String[52];
Deck(String[] ranks, String[] suits, int[] values)
{
for(int i = 1; i <= suits.length; i++)
{
for(int x = 0; x < ranks.length; x++)
{
Card card = new Card(ranks[x], suits[i], values[x]);
deck.add(card);
}
}
shuffle();
}
public String toString()
{
String undealt = "Undealt cards:\n" + undealt[0] + undealt[1] ...;
for(int i = currentCard; i < deck.size(); i++)
{
int g = i - currentCard;
undealt[g] = deck.get(i).toString();
}
}
答案 0 :(得分:0)
您遇到的问题来自代码中的这些行:
private String[] undealt = new String[52];
:
:
public String toString() {
String undealt = "Undealt cards:\n" + undealt[0] + undealt[1] ...;
:
:
}
如您所见,您已在两个不同的范围中定义了变量undealt
。第一个声明位于实例级别,您声明undealt
为类型为String[].
的实例字段实例变量的范围是定义它的整个类,即该类中的所有方法都可以访问实例变量。
第二个声明位于本地块级别,您已将undealt
声明为String.
类型的局部变量局部变量的范围仅限于声明它的块(块由花括号分隔)。
正如您所看到的,undealt
在方法toString(),
中的范围两次作为实例字段,第二次作为局部变量。编译器具有用于在以这种方式冲突时解析变量名称的规则,并将使用局部变量定义。这称为“隐藏”实例字段,即本地变量隐藏实例字段。
当编译器尝试编译时......
String undealt = "Undealt cards:\n" + undealt[0] + undealt[1] ...;
它确定隐藏了String[] undealt
,并且它将undealt
解析为类型String.
因此,当您尝试使用数组元素访问运算符(变量名称后面的括号)时,编译器会给您一个错误。它已确定undealt
是本地String
,因此它没有任何要访问的数组元素。
一个好的做法是避免使用两个具有相同名称的变量,以避免潜在的混淆源,例如此类。在发生冲突的情况下,编译器有一组用于解决变量访问的规则,但这些规则对程序员来说并不明显,并且可能引起混淆。