java - 索引越界异常java
问题描述
我对数组增量有疑问。
我的播放器逻辑类是:
public class Player {
public static final List<String> pointsDescriptions = Arrays.asList("0", "15", "30", "40");
private int score;
public int getScore(){return score;}
String name;
public String getName(){return name;}
public void winBall(){this.score += 1;}
public Player(String name){this.name = name;}
public String getScoreDescription(){return pointsDescriptions.get(score);}
}
游戏逻辑是:
public class TennisGame {
private Player server;
private Player receiver;
public TennisGame(Player server, Player receiver){
this.server = server;
this.receiver = receiver;
}
public String getScore(){
if (server.getScore() >= 3 && receiver.getScore() >= 3){
if(Math.abs(receiver.getScore() - server.getScore()) >= 2){
String winner;
winner = getLeadPlayer().getName() + " won";
return winner;
} else if (server.getScore() - receiver.getScore() >= 1) {
String serverAdvantage;
serverAdvantage = "A" + ":" + receiver.getScoreDescription();
return serverAdvantage;
} else if (receiver.getScore() - server.getScore() >= 1) {
String receiverAdvantage;
receiverAdvantage = server.getScoreDescription() + ":" + "A";
return receiverAdvantage;
} else {
String deuce;
deuce = "40:40";
return deuce;
}
} else {
return server.getScoreDescription() + ":" + receiver.getScoreDescription();
}
}
public Player getLeadPlayer() {
return (server.getScore() > receiver.getScore()) ? server : receiver;
}
}
这是一场网球比赛,所以有得分的可能性: PlayerOne:PlayerTwo -> 40:40 -> PlayerOne winBall -> Advantage:40 -> PlayerTwo winBall -> 40:40 -> PlayerTwo winBall -> 40:Advantage
当 PlayerTwo 的分数增加时,我应该得到 PlayerTwo Won,但不是正确的增量,我有:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at java.util.Arrays$ArrayList.get(Arrays.java:3841)
at com.company.Main.Player.getScoreDescription(Player.java:30)
at com.company.Main.TennisGame.getScore(TennisGame.java:23)
at com.company.Main.Main.main(Main.java:33)
我知道问题是数组长度,但我不知道如何解决它。
主要代码:
Scanner s = new Scanner(System.in);
Player server = new Player("server");
Player receiver = new Player("receiver");
TennisGame tennisGame = new TennisGame(server, receiver);
System.out.println("Server=1");
System.out.println("Server=2");
System.out.println("Please enter the player that wins the point");
System.out.println("The score is: " + tennisGame.getScore());
do {
tennisGame.getScore();
String userInput = s.nextLine();
if (userInput.equals("1")) {
server.winBall();
} else if (userInput.equals("2")) {
receiver.winBall();
} else {
System.out.println("Wrong value, please enter 1 or 2");
}
System.out.println(tennisGame.getScore());
} while (!(Math.abs(receiver.getScore() - server.getScore()) >= 2));
解决方案
你这里有一个逻辑错误,
if (server.getScore() >= 3 && receiver.getScore() >= 3){
只有当和的分数都大于或等于 3时,您if
才会被输入。您想在其中一个为 时输入该逻辑。喜欢,server
receiver
true
if (server.getScore() >= 3 || receiver.getScore() >= 3){
另外,我建议您删除return
分支中的临时变量。喜欢,
if(Math.abs(receiver.getScore() - server.getScore()) >= 2){
return getLeadPlayer().getName() + " won";
} else if (server.getScore() - receiver.getScore() >= 1) {
return "A" + ":" + receiver.getScoreDescription();
} else if (receiver.getScore() - server.getScore() >= 1) {
return server.getScoreDescription() + ":" + "A";
} else {
return "40:40";
}
而且,我们可以使用一对局部变量进一步简化它。我们可以消除一些else
障碍 - 因为我们return
在满足条件时。喜欢,
public String getScore() {
final int rScore = receiver.getScore(), sScore = server.getScore();
if (sScore >= 3 || rScore >= 3) {
if (Math.abs(rScore - sScore) >= 2) {
return getLeadPlayer().getName() + " won";
} else if (sScore - rScore >= 1) {
return "A:" + receiver.getScoreDescription();
} else if (rScore - sScore >= 1) {
return server.getScoreDescription() + ":A";
}
return "40:40";
}
return server.getScoreDescription() + ":" + receiver.getScoreDescription();
}
推荐阅读
- mysql - information_schema 中表行数的差异
- python - 我如何让 Mac 10.13 将模块安装到 3.x 安装而不是 2.7
- sql-server - sql server中的临时表替换
- c# - 在内存中打开 Asp.Net MVC 视图(不在浏览器中)
- javascript - 如何制作html
标签不是在css中添加换行符而是尾随空格?
- c - C/C++ 中的巴特沃斯 BP 滤波,奇怪的频谱
- c - 了解结构内部的结构
- json - json.loads 和 pickle.loads 不能与 async 关键字一起使用?
- python - 使用 pdfminer,代码会卡在命令解释器.process_page(page) 上,并且永远不会终止或抛出错误
- android - 当用户在 RecyclerView + PagerSnapHelper 上卡住滑动时,ScrollListener 代码无法按预期工作