我试图写一个程序,本质上评估一个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;
}
}
}
第一个问题:
allcards.charat(...)
。在setcards
中,您为cards
分配字符串,但在这里,您从allcards
中选择字符。allcards
的内容是什么?什么时候分配?我被分配了吗?(您的代码没有显示这一点)。
第二个问题:
Math.random()*cards.length()
字符串
中字符的有效索引是从0
到length()-1
包含的,但是通过生成随机索引,可以给出从0
到length()
包含的索引。将其更改为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任何地方!