【发布时间】:2019-11-11 23:28:11
【问题描述】:
我有这个 Checkstyle 块来阻止人们在我的项目中打印到控制台:
<module name="Regexp">
<property name="format" value="((System\.|(out|err)\.print)|printStackTrace)"/>
<property name="ignoreComments" value="true"/>
<property name="illegalPattern" value="true"/>
<property name="message" value="No printing to console, use a logger."/>
</module>
正则表达式是((System\.|(out|err)\.print)|printStackTrace)
但是,有人偷偷把这个:out.println
通过导入import static java.lang.System.out;。
所以我将正则表达式更新为:((System\.(out|err))|printStackTrace|(out|err)\.(print|write|append))
我的问题是:这个正则表达式是否涵盖了在 Java 中打印到控制台的所有方式?有没有人在 Checkstyle 中使用更好的正则表达式?
【问题讨论】:
-
\b(?:System\.)?(?:out|err)\.(?:print|write|append)应该可以工作。或者,\b(?:System\.)?(?:(?:out|err)\.)?(?:print|write|append) -
@WiktorStribiżew 作者的解决方案也抓住了这种情况:
PrintStream debug = System.out; debug.print("text"); -
为什么不直接禁止系统退出并一起犯错,不管他们调用什么方法?
-
因为还有其他打印方式,例如
Throwable#printStackTrace()
标签: java regex checkstyle system.out