Java格式化程序问题


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");

根据stacktrace的说法,这种情况发生在课堂上com.aionemu.gameserver.utils.audit.GMService在方法onPlayerUnavailable中的某个位置,该方法在您的问题中缺失。

一个简短的谷歌搜索带来了一个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中的错误。

最新更新