繁体   English   中英

Java Formatter问题

[英]Java Formatter issue

java.util.MissingFormatArgumentException: Format specifier 's'
    at java.util.Formatter.format(Formatter.java:2487) ~[na:1.7.0_80]
    at java.util.Formatter.format(Formatter.java:2423) ~[na:1.7.0_80]
    at java.lang.String.format(String.java:2enter code here792) ~[na:1.7.0_80]
    at com.aionemu.gameserver.utils.audit.GMService.onPlayerUnavailable(Unknown Source) ~[AL-Game.jar:na]
    at admincommands.GMMode.execute(GMMode.java]:73) ~[na:na]

在游戏内发送命令时,出现此错误。

这个问题与我的配置文件有关,还是与java完全有关?

整个代码是:

package admincommands;

 import com.aionemu.gameserver.model.gameobjects.player.Player;
 import com.aionemu.gameserver.network.aion.serverpackets.SM_MOTION;
 import com.aionemu.gameserver.network.aion.serverpackets.SM_PLAYER_INFO;
 import com.aionemu.gameserver.utils.PacketSendUtility;
 import com.aionemu.gameserver.utils.audit.GMService;
 import com.aionemu.gameserver.utils.chathandlers.AdminCommand;

  */
 public class GMMode extends AdminCommand {

    public GMMode() {
        super("gm");
    }

    @Override
    public void execute(Player admin, String... params) {
        if (admin.getAccessLevel() < 1) {
            PacketSendUtility.sendMessage(admin, "You cannot use this command.");
            return;
        }

        if (params.length != 1) {
            onFail(admin, null);
            return;
        }

        if (params[0].toLowerCase().equals("on")) {
            if (!admin.isGmMode()) {
                admin.setGmMode(true);
                admin.setWispable();

                GMService.getInstance().onPlayerLogin(admin); // put gm into
                // gmlist
                GMService.getInstance().onPlayerAvailable(admin); // send
                // available
                // message
                admin.clearKnownlist();
                PacketSendUtility.sendPacket(admin, new SM_PLAYER_INFO(admin, false));
                PacketSendUtility.sendPacket(admin, new SM_MOTION(admin.getObjectId(), admin.getMotions().getActiveMotions()));
                admin.updateKnownlist();
                PacketSendUtility.sendMessage(admin, "you are now Available and Wispable by players");

            }
        }
        if (params[0].equals("off")) {
            if (admin.isGmMode()) {
                admin.setGmMode(false);
                admin.setUnWispable();

                GMService.getInstance().onPlayerLogedOut(admin); // remove gm
                // into
                // gmlist
                GMService.getInstance().onPlayerUnavailable(admin); // send
                // unavailable
                // message
                admin.clearKnownlist();
                PacketSendUtility.sendPacket(admin, new SM_PLAYER_INFO(admin, false));
                PacketSendUtility.sendPacket(admin, new SM_MOTION(admin.getObjectId(), admin.getMotions().getActiveMotions()));
                admin.updateKnownlist();
                PacketSendUtility.sendMessage(admin, "you are now Unavailable and Unwispable by players");
            }
        }
    }

    @Override
    public void onFail(Player admin, String message) {
        String syntax = "syntax //gm <on|off>";
        PacketSendUtility.sendMessage(admin, syntax);
    }
}

该异常告诉您,发生String.format使用的格式说明符多于格式化值。 所以某个地方有个电话

ret = String.format("name %s, surname %s", "Firstname");

根据com.aionemu.gameserver.utils.audit.GMService onPlayerUnavailable ,这发生在类com.aionemu.gameserver.utils.audit.GMService方法中,该问题在您的问题中丢失。

简短的Google搜索显示了一个Git项目 ,您可以在其中查看罪魁祸首的来源,并在此处看到String.format的调用:

Iterator<Player> iter = World.getInstance().getPlayersIterator();
while (iter.hasNext()) {
    PacketSendUtility.sendBrightYellowMessageOnCenter(iter.next(), "Information : " + String.format(adminTag, player.getName()) + LanguageHandler.translate(CustomMessageId.ANNOUNCE_GM_DECONNECTION));
}

变量adminTag是根据您要传递的Player实例中的设置而构建的,因此,更进一步地说,我们需要有关该实例状态的信息-查看源代码通常仅显示以下几行是可能的您遇到异常的原因:

if (MembershipConfig.PREMIUM_TAG_DISPLAY) {
    switch (player.getClientConnection().getAccount().getMembership()) {
        case 1:
        adminTag = sb.insert(0, MembershipConfig.TAG_PREMIUM.substring(0, 2)).toString();
        break;
    case 2:
        adminTag = sb.insert(0, MembershipConfig.TAG_VIP.substring(0, 2)).toString();
        break;
    }
}
// * = Wedding
if (player.isMarried()) {
    adminTag = sb.insert(0, WeddingsConfig.TAG_WEDDING.substring(0, 2)).toString();
}

看一下保存例如TAG_WEDDING的值的相应类,我想您的配置包含针对这些常量中至少一个以%s开头的自定义值,因此adminTag最终以%s%s结尾。

所以回答你的问题

这个问题与我的配置文件有关,还是与java完全有关?

我猜这是配置文件中的错误(某些字符串以%s开头)或您正在使用的库中的错误,但这绝对不是Java中的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM