当前位置: 首页 > 知识库问答 >
问题:

为我的一个实例变量设置值不起作用

孔权
2023-03-14

我试图写一个程序,本质上评估一个5卡扑克手,是用户生成的。程序的一部分是用户可以选择一个变量来随机改变。问题在于为我的一个实例变量设置值,现在,我的setCards、getCards和changeOne方法是:

public void setCards(String str) {
    this.cards = str;
    calculateScore();
    history = history + cards + score + changes;
    changes++;
}

public String getCards() {
    return this.cards;
}

public void changeOne(int pos) {
    
    getCards();
    
    calculateScore();
    history = history + cards + score + changes;
    
    randomChar = allCards.charAt((int)(Math.random()*cards.length()));
    this.cards = cards.substring(0, pos) + randomChar + cards.substring(pos + 1, cards.length());
    
    changes++;
    
} 

在另一个类中,我使用:

cards = in.nextLine().toUpperCase();
myCards.setCards(cards);

我不知道为什么,但是每当我尝试使用changeOne方法时,总是给我一个错误:线程“main”java.lang.StringIndexOutOfBoundsException中的Exception:Begin0,End3,length 0。我不知道发生了什么,为什么它没有得到适当的价值卡,帮助将非常感谢。

完整代码:第一类:

import java.util.Scanner;
public class Assignment4{

public static void main(String[] args) {
    
    Scanner in = new Scanner(System.in);
    FiveCards myCards = new FiveCards();
    
    int position;
    String choice, cards;
    char charChoice;
    
    final char NEW = 'A';
    final char CHANGE = 'B';
    final char DISPLAY = 'C';
    final char QUIT = 'Q';
    
    do {
        
        System.out.println("Choose (A: Make New Cards), (B: Change One Card), (C: Display Data), or (Q: Quit)");
        choice = in.next();
        charChoice = choice.toUpperCase().charAt(0);
        
        switch(charChoice) {
            case NEW:
                System.out.println("*** Make New FiveCards ***");
                System.out.println("Type five letters without space: ");
                in.next();
                cards = in.nextLine().toUpperCase();
                myCards.setCards(cards);
                System.out.println("[Cards] [Score] [Changes]");
                myCards.displayData();
                break;
            case CHANGE:
                System.out.println("*** Change One Card ***");
                System.out.println("Type one position to change (0-4): ");
                position = in.nextInt();
                myCards.changeOne(position);
                System.out.println("[Cards] [Score] [Changes]");
                myCards.displayData();
                break;
            case DISPLAY:
                System.out.println("[Cards] [Score] [Changes]");
                myCards.displayData();
                break;
            case QUIT:
                System.out.println("*** End of Program ***");
                break;
            default:
                System.out.println("Invalid input. Try Again");
                break;
        }
        
    }while(charChoice!=QUIT);
    
}

}

第二类是:

public class FiveCards {
private String cards, history;
private int score, changes, counter;
private String allCards = "1234567890JQK";
private char randomChar;

public FiveCards() {
}

public void setCards(String str) {
    this.cards = str;
    calculateScore();
    history = history + cards + score + changes;
    changes++;
}

public String getCards() {
    return this.cards;
}

public void changeOne(int pos) {
    

    
    calculateScore();
    history = history + cards + score + changes;
    
    randomChar = allCards.charAt((int)(Math.random()*cards.length()));
    this.cards = cards.substring(0, pos) + randomChar + cards.substring(pos + 1, cards.length());
    
    System.out.println(cards);
    
    changes++;
    
}

public void calculateScore() {
    for(int i = 0; i<cards.length(); i++) {
        for(int j = 0; j<cards.length(); j++) {
            if((cards.charAt(i) == cards.charAt(j)) && (i != j)) {
                counter++;
            }
        }
    }
    if(counter == 2) {
        score = 1;
    }
    else if(counter == 4) {
        score = 2;
    }
    else if(counter == 6) {
        score = 3;
    }
    else if(counter == 8) {
        score = 4;
    }
    else {
        score = 0;
    }
}

public String displayData() {
    
    calculateScore();
    history = history + cards + score + changes;
    
    if(cards.length()<=1) {
    return cards + "    " + score + "   " + changes;
    }
    else {
        return "Empty" + "  " + score + "   " + changes;
    }
    
}

}

共有1个答案

杨征
2023-03-14

第一个问题:

allcards.charat(...)。在setcards中,您为cards分配字符串,但在这里,您从allcards中选择字符。allcards的内容是什么?什么时候分配?我被分配了吗?(您的代码没有显示这一点)。

第二个问题:

Math.random()*cards.length()

字符串中字符的有效索引是从0length()-1包含的,但是通过生成随机索引,可以给出从0length()包含的索引。将其更改为math.random()*(cards.length()-1)

 类似资料:
  • 问题内容: 我不知道为什么,但是突然出现以下错误。 到现在为止一切正常,但今天会产生以下错误 当我测试到本地服务器时,它工作正常,但是当我上传到000webhost服务器时,它将产生一个错误 变量’的sql_mode’不能被设置为’REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@@的sql_mode’ SELECT值FROM WHERE = ‘有效

  • #include <stdio.h> int func(void) { int i = 2; return i; } int main(void) { int a = 0; a = func(); printf("%d\n", a); return 0; } 技巧 在gdb中,可以用“set var variable=expr”命令设置变量

  • 目标: 使用 Android Studio 附带的(图形)AVD 管理器管理 Android 虚拟设备 (avd),但使用不同的存储文件夹。 默认文件夹:// 想要的文件夹:/ 根据文档,这应该是有效的: (加载在.bashrc中) 这确实适用于命令行: 运行< code > emulator-avd Pixel _ 2 _ API _ 28 也很好。 然而,AVD管理器没有显示任何设备,当我使用

  • 问题内容: 我想从主模块和所有子模块登录到单个日志文件。 从主文件(我在其中定义记录器)发送的日志消息按预期工作。但是缺少从调用发送到导入函数的函数。 如果我使用下面的示例1中的logging.basicConfig,它将正常工作。但是允许更多自定义设置的第二个示例不起作用。 有什么想法吗? 示例1-工作 在这里,我创建了两个处理程序,并将它们传递给: 示例2-无法正常工作 在这里,我创建两个处理

  • 问题内容: 我会这样声明一个空的String变量: 是否有等效的’DateTime’变量? 更新 : 问题是我在SQL中将此“ DateTime”用作“ StoredProcedure”的参数。例如: 当我运行此代码时,捕获到一个异常,告诉我“ StoredProcedure”期望使用“ @SurgeryDate”参数。但是我提供了它。知道为什么吗? 问题答案: 由于是不能分配给它的值类型,但是正

  • 我正在尝试学习C,特别是如何声明和初始化变量。我写了这段代码,我不知道为什么变量c给出了一个我还没有分配的值。 输出是-2,但我没有状态c=-2任何地方!