【问题标题】:Index out of bound exception java索引越界异常java
【发布时间】:2018-11-19 21:18:28
【问题描述】:

我对数组增量有疑问。

我的播放器逻辑类是:

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 获胜,但我得到的不是正确的增量:

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));

【问题讨论】:

    标签: java exception arraylist indexoutofboundsexception


    【解决方案1】:

    首先你这里有逻辑问题,

    } while (!(Math.abs(receiver.getScore() - server.getScore()) >= 2));
    

    如果一名球员有2分优势,并不意味着他赢了比赛,因为比分可以是30:0、0:30、40:15等。
    而不是这个,我建议将游戏状态保留在 TennisGame 类中:

    public boolean isFinished;
    
    public boolean isFinished() {
        return isFinished;
    }
    

    并在其中一名玩家赢得比赛时设置它,并像这样在这里使用它:

    } while(!tennisGame.isFinished)
    

    其次为了避免崩溃并遵循网球比赛逻辑我建议做以下更改:

    public static final List<String> pointsDescriptions  = Arrays.asList("0", "15", "30", "40", "A");
    

    还做了一些优化以避免大量变量的使用:

    public String getScore(){
            String score;
            if (server.getScore() >= 3 && receiver.getScore() >= 3){
                if(Math.abs(receiver.getScore() - server.getScore()) >= 2){
                    score = getLeadPlayer().getName() + " won";
                    isFinished = true;
                } else if (server.getScore() - receiver.getScore() >= 1) {
                    score = "A" + ":" + receiver.getScoreDescription();
                } else if (receiver.getScore() - server.getScore() >= 1) {
                    score = server.getScoreDescription() + ":" + "A";
                } else {
                    score = "40:40";
                }
            } else if (server.getScore() > 3 || receiver.getScore() > 3) {
                score = getLeadPlayer().getName() + " won";
                isFinished = true;
            } else {
                score = server.getScoreDescription() + ":" + receiver.getScoreDescription();
            }
            return score;
        }
    

    【讨论】:

      【解决方案2】:

      你这里有一个逻辑错误,

      if (server.getScore() >= 3 && receiver.getScore() >= 3){
      

      只有当serverreceiver 两者 的分数大于或等于三时,才会输入您的if。您想在 eithertrue 时输入该逻辑。喜欢,

      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();
      }
      

      【讨论】:

      • if 块内使用无条件的return 语句,else 子句是多余的。
      猜你喜欢
      • 2013-03-30
      • 2013-03-05
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多