如果不重新运行方法,则无法保存 Java 中方法的返回值

Unable to save a return value from a method in Java without re-running method

提问人:Sarah Parker 提问时间:10/10/2023 最后编辑:ChaosfireSarah Parker 更新时间:10/16/2023 访问量:104

问:

编码新手,如果这是一个基本问题,很抱歉。我正在做一项任务,用 java 为游戏战舰编写代码。

我正在使用一种方法让用户输入坐标,然后将这些坐标保存为数组以在另一个方法中使用。我知道方法中的变量不会保存。

因此,我为该方法创建了一个返回值,然后在我的主类中创建了一个新变量,并将其设置为该方法的返回值。

public static char[][] player1ships() {
  System.out.println("PLAYER 1, ENTER YOUR SHIPS' COORDINATES.");
  Scanner input = new Scanner(System.in);
  char[][] player1 = new char[5][5];
  for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
      player1[i][j] = '-';
    }
  }
  for (int i = 1; i <= 5; ) {
    System.out.println("Enter location for ship " + i);
    int a = input.nextInt();
    int b = input.nextInt();
    if ((a >= 0 && a < 5) && (b >= 0 && b < 5) && (player1[a][b] == '-')) {
      player1[a][b] = '@';
      i++;
    } else if ((a >= 0 && a < 5) && (a >= 0 && b < 5) && (player1[a][b] == '@'))
      System.out.println("You can't place two or more ships on the same location");
    else if ((a < 0 || a >= 5) || (b < 0 || b >= 5))
      System.out.println("You can't place ships outside the " + 5 + " by " + 5 + " grid");
  }
  return player1;
}

我想运行该方法,以便用户输入坐标,然后保存返回数组以供以后使用。但是,当我运行该程序时,它似乎运行了该方法两次,因为输出提示用户完成 2 个“输入位置”周期。

当我在末尾添加测试行时,它确实在索引数组中打印了正确的符号,因此它似乎确实保存了更新的 arary。

那么,如何在不再次运行和打印整个方法的情况下将返回值保存为变量呢?

    public static void main(String[] args) {
        char [][] strike = player1ships();
                
        
        player1ships();

        
        //test to see if array updated
        System.out.println(strike[0][0]);
        
    }
}

这是程序运行的结果...并执行 player1ships 方法两次而不是一次。

显示它如何在打印出最后一行之前提示用户完成两个周期

java 数组 变量 方法 返回值

评论

2赞 Pino 10/10/2023
“它似乎运行了两次方法”,是的,在你调用方法两次。main()

答:

2赞 cyberbrain 10/10/2023 #1

如果你调用一个方法,但对它的返回值不做任何事情,Java 不会抱怨,所以你实际上调用了该方法两次:player1ships()

char [][] strike = player1ships();

player1ships();

您可以简单地删除第二个调用(没有赋值的调用),因为您不使用其结果。player1ships()

评论

0赞 Sarah Parker 10/10/2023
不过,我确实想稍后在不同的方法中使用返回值。我想在另一个将采用这些值的方法中使用返回值。方法是 Battle(strike)。使用变量 strike,它应该设置为 Player1ships() 的返回变量。但是当它输入 strike 时,它会再次重新运行 player1ships() 方法,而不是使用返回值。
0赞 Arun 10/10/2023
该值将存储在 strike 本身中,首次调用它时,如果需要,您可以将其传递给其他方法。或者你能提供更多信息吗
0赞 Sarah Parker 10/10/2023
@Arun是的,我的目标是在 strike 中保存返回值。当我尝试在另一个方法 Battle(strike) 中调用它时,它仍然会重新运行第一个方法 player1ships()。
0赞 Arun 10/10/2023
不@SarahParker它不会再次调用 player1Ships。我刚才用相同的代码进行了测试。删除第二个 player1ships() 方法。它工作正常。删除第二个调用后,您可以再次运行吗?如果仍然有问题,您可以分享完整的代码。
1赞 cyberbrain 10/10/2023
@VinitMore我认为这让 OP 更加困惑。@SarahParker您能否将调用的代码片段(具有更多上下文)添加到您的问题中?Battle(strike)
0赞 Junwei Zhu 10/10/2023 #2
public static void main(String[] args) {
    char [][] strike = player1ships();

     //This line runs the method again, which is what you don't want.
     //player1ships();

    //test to see if array updated
    System.out.println(strike[0][0]);

}
1赞 Sarah Parker 10/11/2023 #3

谢谢大家的帮助。我删除了第二个player1ships();方法在我的主方法和代码中运行良好,并且还适当地保存了变量以用于另一个方法。我确定我的格式很糟糕,并且有更好的方法来编写此程序,但我非常感谢所有帮助进行故障排除!

这是我更新的代码:

    public static void main(String[] args) {
    char [][] strike = player1ships();
    
    char [][] boardhit1 = battle(strike);
    
    
    //test to see if array updated
    System.out.println(strike[0][0]);
    System.out.println(boardhit1[0][0]);
1赞 Arun 10/11/2023 #4

在 main 方法删除/注释中,第二个方法调用并重新运行代码。它工作正常

{
   public static void main(String[] args) {
        char [][] strike = player1ships();
                
        
        player1ships();     ----> this line

        
        //test to see if array updated
        System.out.println(strike[0][0]);
        
    }
}

希望它工作正常吗?