Java比较方法返回值报cannot invoke equals(void)错误如何解决
报错根因
你触发cannot invoke equals(void) on primitive type void报错的核心原因和你推测的作用域问题无关:
- 你定义的
userInput()、compInput()两个方法的返回值类型为void,代表方法执行后不会返回任何结果,自然无法对无返回值的方法调用equals()做内容比较。
除此之外你的代码还存在以下影响运行的问题:
compInput()方法内V system="rock";行存在冗余字符V,属于语法错误Random.nextInt(3)生成的随机数范围是0、1、2,你当前判断分支仅覆盖1、2、3,会出现system变量未赋值的问题- main方法中你先单独调用了一次
userInput()、compInput(),if判断中又重复调用了一次,会导致用户需要输入2次、电脑生成2次不同的随机结果,不符合游戏逻辑
修复后完整代码
package rockpaper; import java.util.Random; import java.util.Scanner; public class Game { // 定义全局常量避免重复写魔法值 private static final String ROCK = "r"; private static final String PAPER = "p"; private static final String SCISSORS = "s"; public static void main(String[] args) { // 调用方法拿到结果存在变量中,仅调用一次 String userMove = userInput(); String compMove = compInput(); if(userMove.equals(compMove)){ System.out.println("平局"); } else if( (userMove.equals(ROCK) && compMove.equals(SCISSORS)) || (userMove.equals(PAPER) && compMove.equals(ROCK)) || (userMove.equals(SCISSORS) && compMove.equals(PAPER)) ){ System.out.println("你赢了"); } else { System.out.println("你输了"); } } // 返回值从void改成String,返回用户输入的选择 public static String userInput(){ Scanner put = new Scanner(System.in); System.out.println("enter your move...."); String user = put.nextLine(); // 可自行扩展非法输入校验逻辑 switch (user) { case ROCK: System.out.println("your move is rock"); break; case PAPER: System.out.println("your move is paper"); break; case SCISSORS: System.out.println("your move is scissors"); break; } return user; } // 返回值从void改成String,返回电脑生成的选择 public static String compInput(){ Random rand = new Random(); int comp = rand.nextInt(3); String system = ""; // 修正随机数判断范围 switch (comp) { case 0: system = ROCK; System.out.println("computer move is rock"); break; case 1: system = PAPER; System.out.println("computer move is paper"); break; case 2: system = SCISSORS; System.out.println("computer move is scissors"); break; } return system; } }
核心修改点
- 调整两个方法的返回值类型为
String,方法执行结束后返回对应的选择内容 - 修正
compInput()方法的语法错误和随机数判断逻辑,避免变量未初始化问题 - main方法中仅调用一次两个方法,将返回结果存入变量后再做比较,符合游戏运行逻辑
- 补充了胜负判断的基础逻辑,可直接运行测试
内容的提问来源于stack exchange,提问作者Edith Stark
相关产品推荐
相关产品推荐

