9

在我的项目(Java/Play 框架)中,我有一个错误处理路由,它检查来自 Web 服务的响应,如果响应是错误代码,我们会显示相应的错误消息,说明用户输入有什么问题,服务会检查用户输入有效性。

当用户输入 % 符号时,此逻辑中断,因为错误显示逻辑使用

String.format(message, messageArgs);

它将 messageArgs 插入到找到 % 的消息字符串中,如果 messageArgs 也包含 %,我会得到一个异常。

在显示消息之前,我需要清理、转义或以其他方式从用户输入中删除 %。

message: 请求的电子邮件地址 %s 无效 messageArgs: orlybg%@gmail.com

关于如何以最简单、最短的方式在 Java 中执行此操作的任何建议?

这是错误日志的一部分

 java.util.UnknownFormatConversionException: Conversion = 'i'
   at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2646)
   at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2675)
   at java.util.Formatter.parse(Formatter.java:2528)
   at java.util.Formatter.format(Formatter.java:2469)
   at java.util.Formatter.format(Formatter.java:2423)
   at java.lang.String.format(String.java:2797)
   at controllers.api.PublicAPI.renderAPIError(PublicAPI.java:176)
   at controllers.api.DeviceAPI.setEmailAddress(DeviceAPI.java:736)
   at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
   at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
   at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484)
   at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479)
   at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
   at Invocation.HTTP Request(Play!)

谢谢!

4

3 回答 3

6

消息字符串中,% 符号用另一个 % 转义。所以你需要把它加倍: %%
例如: "Bla bla %i bla" -> "Bla bla %%i bla"
messageArgs字符串中,% 符号没有问题,你不需要逃避它

于 2013-09-20T18:39:31.667 回答
5

%%当您需要打印字符串时,在格式化程序字符串中使用%

String.format("sendOneSuccessCountRate: %7.2f%%"
              ,sendOneSuccessCountRate //0.95
             );

会给你95.00%

于 2016-06-15T02:28:28.610 回答
1

如果您java.util.UnknownFormatConversionException: Conversion = 'i'最有可能收到您%imessage尝试格式化整数时使用的信息,那么这是不正确的。您必须使用%d来格式化十进制整数。可在此处找到完整支持的转换规范。

于 2013-09-20T18:34:17.100 回答