Java新手求助:调用Tile类switch衍生方法时遇void类型错误
问题分析与修复方案
嘿,刚看了你的代码和遇到的问题,咱们一步步来拆解和解决这个'void' type not allowed here错误:
错误根源拆解
Tile.draw()的参数类型不匹配:Tile.draw()方法需要接收一个Tile.Action枚举类型的参数,但你传入的是Tile.caseHit()/Tile.caseMiss()——这两个方法是void类型,没有返回值,根本没法作为参数传递给需要Action类型的方法。- 赋值语句的逻辑错误:
HitPosition[pos[0]][pos[1]]是int类型的数组元素,但你试图把Tile.draw(...)的结果赋值给它,可draw()本身也是void方法,没有任何返回值能用来赋值。
具体修复步骤
第一步:修正Player类的fire方法逻辑
你不需要直接调用caseHit()/caseMiss(),而是应该把对应的Action枚举值传给Tile.draw(),同时给HitPosition设置合理的int值来记录击中/未击中状态:
import java.util.Scanner; public class Player { String username; static int shotcount; static int misscount; static int hitcount; static int repeatshot; private int HitPosition[][] = new int[10][10]; public Player(String username) { this.username = username; } private void placeAllShips() { // 这里可以补充你的战舰放置逻辑 } public void fire(int pos[],int board,boolean hit) { if(hit == true) { // 传入Action.Hit枚举值给draw方法,触发击中的打印逻辑 Tile.draw(Tile.Action.Hit); HitPosition[pos[0]][pos[1]] = 1; // 用1标记击中位置 shotcount++; hitcount++; } else { // 传入Action.Miss枚举值给draw方法,触发未击中的打印逻辑 Tile.draw(Tile.Action.Miss); HitPosition[pos[0]][pos[1]] = 0; // 用0标记未击中位置 shotcount++; misscount++; } } }
第二步:优化Tile类的设计(可选但更易维护)
你当前的caseXxx()方法直接打印输出,draw()通过switch调用它们,其实可以简化逻辑,让代码更灵活:
public class Tile { private int x,y; static boolean hidden; public Action tile_action; public enum Action { Sea, Ship, Hit, Miss } Action action; // 修正构造函数,补充x和y的参数接收 public Tile(int x, int y, Action action) { this.x = x; this.y = y; this.action = action; this.tile_action = action; } // 把输出逻辑封装成返回字符的方法,既可以用来打印,也能用来记录状态 private static char getActionSymbol(Action action) { switch(action) { case Sea: return '~'; case Ship: return hidden ? '~' : 's'; case Hit: return 'X'; case Miss: return 'O'; default: return '?'; } } public static void draw(Action action) { System.out.println(getActionSymbol(action)); } // 新增方法,方便获取状态字符用于数组记录 public static char getSymbol(Action action) { return getActionSymbol(action); } }
如果用优化后的Tile类,还可以把HitPosition改成char数组,让状态记录更直观:
// 修改HitPosition的类型 private char HitPosition[][] = new char[10][10]; public void fire(int pos[],int board,boolean hit) { Tile.Action currentAction = hit ? Tile.Action.Hit : Tile.Action.Miss; Tile.draw(currentAction); HitPosition[pos[0]][pos[1]] = Tile.getSymbol(currentAction); shotcount++; if(hit) { hitcount++; } else { misscount++; } }
额外小提醒
你原来Tile类的构造函数里this.x = x; this.y = y;是无效的,因为构造函数没有接收x和y的参数,导致x和y一直是默认值0,记得像上面的优化代码一样补充参数哦。
内容的提问来源于stack exchange,提问作者vaskar
相关产品推荐
相关产品推荐

