You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java新手求助:调用Tile类switch衍生方法时遇void类型错误

问题分析与修复方案

嘿,刚看了你的代码和遇到的问题,咱们一步步来拆解和解决这个'void' type not allowed here错误:

错误根源拆解

  1. Tile.draw()的参数类型不匹配:Tile.draw()方法需要接收一个Tile.Action枚举类型的参数,但你传入的是Tile.caseHit()/Tile.caseMiss()——这两个方法是void类型,没有返回值,根本没法作为参数传递给需要Action类型的方法。
  2. 赋值语句的逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:24:15