数组需要,但java.lang.String找到了纸牌游戏

时间:2016-01-24 21:33:47

标签: arrays

我正在为游戏制作牌组和牌级,并且在创建和使用字符串数组时遇到错误。 我的代码看起来像这样:错误是从底部开始的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();
    }
}

1 个答案:

答案 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,因此它没有任何要访问的数组元素。

一个好的做法是避免使用两个具有相同名称的变量,以避免潜在的混淆源,例如此类。在发生冲突的情况下,编译器有一组用于解决变量访问的规则,但这些规则对程序员来说并不明显,并且可能引起混淆。