Java : 如何找到代码中写了 if 但没有最终 else 的代码片段?

2019-04-24 12:08:34 +08:00
 c4f36e5766583218
if (1==1) {
 // if
} else {
 // else
}

if (1==1) {
 // if
} else if {
 // else if
}

if (1==1) {
 // if
}

就找到类似找到第 2,3 个这样的代码片段。checkstyle 可以做到吗?或者有其它检查工具吗?

2184 次点击
所在节点    问与答
11 条回复
geelaw
2019-04-24 12:20:38 +08:00
你可以写一个 custom check 来完成这件事情。如果你想找到所有没有 else 的 if,你只需要关注 { } if else 四个 token 即可;如果你只想判断是否存在没有 else 的 if,你只需要关注 if else 这两个 token。
stevenbipt
2019-04-24 12:24:11 +08:00
第一想法是通过栈实现,类似于匹配括号的想法,遇到 if 就入栈,遇到 else 出栈,去户县栈没空遇到下一个 if 那缺失应该就是在这一段之间
Mogugugugu
2019-04-24 12:24:55 +08:00
sonar 可以,idea 装一个 sonar lint 插件,然后在 rules 里面可以找到这条规则 需要自己手动开启,默认没有打开。
c4f36e5766583218
2019-04-24 12:36:34 +08:00
@Mogugugugu #3 好的,谢谢。https://www.sonarsource.com/products/sonarlint/ SonarLint 的官网打不开 2333
Mogugugugu
2019-04-24 13:03:09 +08:00
night98
2019-04-24 13:08:47 +08:00
https://blog.csdn.net/linsongbin1/article/details/80211919
直接拉到末尾处,参考他这种方法
c4f36e5766583218
2019-04-24 13:41:24 +08:00
@night98 #6 看了下,“按照模板找内容” 好像解决我的问题。。(不过这篇博文蛮不错的
c4f36e5766583218
2019-04-24 14:32:00 +08:00
@Mogugugugu #3 测试了下,发现有 else if 后面是否需要 else 的检查,但没有 if 后面是否需要 else 的检查。23333
c4f36e5766583218
2019-04-24 14:35:04 +08:00
@stevenbipt #2 我觉得有空还是用 2 楼说的,Python/Java 自写一个比较好,2333 因为感觉 if 后面好多情况都是不用写 else 的,所以一些现有工具也没加这个功能。
stevenbipt
2019-04-24 19:47:16 +08:00
@c4f36e5766583218 #9 那就搞一个~目测难度也不高
geelaw
2019-04-26 17:16:07 +08:00
@stevenbipt #2 if { if {} else {} } else {} 不缺少 else,但你的算法会觉得缺少。正确的算法必须能够知道现在出现的 else 是哪个 if 的,为此需要追踪 { }——把 if 和 else 设置为一种括号,{ 和 } 设置为另一种括号,源代码是合法 Java 代码且每个 if 都有 else,当且仅当这个序列是合法括号序列。

另外不太理解为什么要单独列出 2、3 两个例子,2 和 3 是同一种情况,处理了 3 自然就会找到 2。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX