V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
c4f36e5766583218
V2EX  ›  问与答

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

  •  
  •   c4f36e5766583218 · 2019-04-24 12:08:34 +08:00 · 2161 次点击
    这是一个创建于 2032 天前的主题,其中的信息可能已经有所发展或是发生改变。
    if (1==1) {
     // if
    } else {
     // else
    }
    
    if (1==1) {
     // if
    } else if {
     // else if
    }
    
    if (1==1) {
     // if
    }
    

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

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

    另外不太理解为什么要单独列出 2、3 两个例子,2 和 3 是同一种情况,处理了 3 自然就会找到 2。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:55 · PVG 18:55 · LAX 02:55 · JFK 05:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.