V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
qwerthhusn
V2EX  ›  程序员

IDEA 的代码检测是真的智能,但是有些人就是不关注代码飘黄

  •  
  •   qwerthhusn · 2019-09-24 11:14:13 +08:00 · 8531 次点击
    这是一个创建于 1922 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Java 静态检查工具,IDEA 自带的最智能,无论是代码优化建议还是分支检测出来的潜在的 BUG。 只要你关注代码飘黄的部分,九成都是可以优化的或者是 BUG (包括很隐晦的要自己估计很久都看不出来的),不如鼠标放上去看一下

    然后就是 FindBugs,但是以我的经验,如果 IDEA 的都处理了,FindBugs 好像也扫不出来什么东西了。

    PMD,CheckStyle 这种更像是代码风格检查工具。

    BTW:阿里巴巴的静态代码检查,我认为这种东西新手用一下还是不错的。对于经验比较丰富的老鸟,基本上无用处。举个例子,不让你用Executors.new...而是直接去用ThreadPoolExecutor,就是为了能更好理解 Java 线程池。再举个例子,要求你把每一个@Transactional都显示指定上rollbackFor,就是为了能正确理解 Spring 事务回滚机制。


    我有一个朋友,他就是没记性,去定位 BUG,最后花了很久才看出来的一个分支 BUG,而且 IDEA 都已经检测出来了。 中间我估计跟他说过不下三四次了,但是最近一看他新的代码,还是满屏密密麻麻的黄框。。。

    真的很奇怪,有些人就是不长记性,也不清楚为什么,我之前的一个刚开始干的同事,不关注代码缩进,最后一大篇代码跟鸡挠的一样,甚至有多少个方法都一眼看不出来。跟他说过无数次,但是后面发现新提交的还是那样。


    本来主旨是想吐槽一波不长记性的人,但是还是忍不住吹了一波 IDEA 的静态代码审查。

    第 1 条附言  ·  2019-09-24 14:47:44 +08:00
    当然,不是所有的 IDEA 检测出的问题都会去处理,比如
    1. Field Injection。虽然知道不是 Best Practice,但是还是一直用。主要是 AService 和 BService 相互依赖的时候,如果不用 Field Injection 是无法搞的(虽然相互依赖不是个好习惯),但是还好出现的不多。。。我记得之前的公司代码检查有一个软件名字忘记了叫什么了(一个被定制了的 Eclipse ),就是检查相互依赖,严重依赖外部,数据类这些东西,最后得到一个数值,越小越好的那种。
    2. Access can be private/package 就是 IDEA 检查所有方法的调用的地方,并建议你把访问权限缩小。这种我一般也不会去处理。
    3. @NonNullApi 相关的,这块遇到的比较少,而且也没仔细关注。主要是在 @Override 一些框架的方法时,会在方法参数上报这些东西。由于遇到的较少,所以一直没有特别关注。跟 IDEA 认为程序的流向有点关系吧。。比如,Spring 的 Asserts.notNull(a, "a"),你写完这个,IDEA 分析的时候下面 a 肯定不会是 null,如果你后续有判断 a == null 的话会被认为是死代码(逻辑层面的死代码不是编译层面的)。。但是如果你自己封装了一个断言类,IDEA 就不认识了。
    4. 拼写错误和代码重复等。。。。这类检视问题显示的是个绿色下划线和黄色下划线,看实际情况
    5. 黑色带下划线的,多半是方法没被调用到(有可能是垃圾代码或者预留代码),泛型参数可以忽略,匿名内部类或者 lambda 可以进一步简化等。。。这种按 alt+enter 就能处理的
    46 条回复    2019-09-27 16:47:44 +08:00
    promise2mm
        1
    promise2mm  
       2019-09-24 11:26:59 +08:00
    @Transactional 类似这种飘黄 我都是直接 Disable Inspection 以后就不提示了
    qwerthhusn
        2
    qwerthhusn  
    OP
       2019-09-24 11:37:45 +08:00
    @promise2mm 那你感觉阿里的这个能检测出实际有用的东西么?举个例子
    StevenTong
        3
    StevenTong  
       2019-09-24 11:41:27 +08:00
    看人,我会去看这种东西.
    tulongtou
        4
    tulongtou  
       2019-09-24 11:41:58 +08:00   ❤️ 12
    不是所有人都有工匠精神,不是所有人都热爱编程,绝大部分人仅仅是把它当作一个糊口都工具,管他黄不黄呢,有饭吃就行
    winterbells
        5
    winterbells  
       2019-09-24 11:42:46 +08:00 via Android   ❤️ 5
    防风打火机防风但不防 sb
    xuanbg
        6
    xuanbg  
       2019-09-24 11:42:54 +08:00
    阿里规约里面 Executors.new 和 @Transactional 这两个真的是超级讨厌,我都是要 disable 掉的。
    gamexg
        7
    gamexg  
       2019-09-24 12:01:03 +08:00
    飘黄太多也挺烦人,
    而且很多我知道自己在做什么,不需要标记,但是它还是标记。

    昨天刚碰到的不必要的提示:
    一些关闭文件、连接的操作没有检查返回值是否关闭成功。
    我自认为是很小心,基本全部的返回值都会做检查,除非是实在没意义的,这种提示对我是没大意义的。

    初始化时打开配置文件检查到出错时直接 log.Fatal,Fatatl 内部会调用 os.Exit。
    但是 idea 识别不到调用了 os.Exit,还是警告文件可能为 null。
    passerbytiny
        8
    passerbytiny  
       2019-09-24 12:01:07 +08:00
    零黄与满屏黄是等价的,偶尔飘黄才有价值。工具检测只是辅助,只要没有人工评审,基本都是五十步笑百步。

    至于阿里的规则,那是给专职评审人员——不写代码、只负责评审代码、懒得针对工具的不足做额外工作——准备的。
    zjp
        9
    zjp  
       2019-09-24 12:11:43 +08:00 via Android
    见过别人整个屏幕都是黄色的…

    @tulongtou bug 迟早要修的。解决静态检查的告警的成本很低,多数时候 IDEA 可以自动处理
    chengyiqun
        10
    chengyiqun  
       2019-09-24 12:32:46 +08:00
    很多时候, 修的成本还是有点高的, 有的人代码组织结构不好, 跑着虽然没问题, 但是看起来及其不爽. 我之前有个睿智的同事, 一个场景有多个低级错误, 空指针数组越界一堆. equals 方法, 常量不写前面, webservice 返回的数组不判长度就直接取, String 和 Date 类型也用 equals 比较, 简直了....然后和另一个同时修这个服务的代码等于是重新开发了一遍. 他已经是我们项目组所有人都清楚的不靠谱的人了.
    chengyiqun
        11
    chengyiqun  
       2019-09-24 12:34:23 +08:00
    我写代码都尽量让代码美观易读, javadoc 都认真的写的. 甚至 javadoc 上都用 html 标签, 标注关键信息. 不是我自夸, 我是我们项目组里最强迫症的那个人.
    0x4F5DA2
        12
    0x4F5DA2  
       2019-09-24 12:37:47 +08:00
    配合 SonarLint 以及阿里规约使用效果更佳
    chocotan
        13
    chocotan  
       2019-09-24 12:53:38 +08:00
    阿里那玩意儿安装了,发现很多根本没问题的地方也提示,就删了。
    hhhsuan
        14
    hhhsuan  
       2019-09-24 12:57:16 +08:00
    没有洁癖的程序员不是好的程序员,我都是告警全部清空的,留一个都很扎眼。
    CEBBCAT
        15
    CEBBCAT  
       2019-09-24 13:04:39 +08:00 via Android
    错误报告都懒得读,还管你飘黄?你以为你老几啊?

    zhady009
        16
    zhady009  
       2019-09-24 13:13:17 +08:00
    我也有点代码洁癖..一般只有 field injection 的警告

    多注意下挺好的 起码对自己的代码质量有提升
    luckyrayyy
        17
    luckyrayyy  
       2019-09-24 13:14:52 +08:00
    我是百分百要解决的,只有提示代码重复,让我重构的可能视长度解不解决。
    Salvation
        18
    Salvation  
       2019-09-24 13:15:16 +08:00
    idea 的代码检测我关闭了不少,原因是每次代码才写到一半,就开始各种黄,难受。
    dobelee
        19
    dobelee  
       2019-09-24 13:17:07 +08:00 via Android
    坚决扫荡任何一片黄色。
    Mogamigawa
        20
    Mogamigawa  
       2019-09-24 13:23:07 +08:00   ❤️ 2
    以后测试组就叫 扫黄打红小组 吧
    qiyuey
        21
    qiyuey  
       2019-09-24 13:52:49 +08:00
    无非就是:懒、笨、又懒又笨
    chendy
        22
    chendy  
       2019-09-24 14:06:28 +08:00   ❤️ 1
    曾经接手老项目,打开代码仿佛有人尿在了屏幕上一样…
    iffi
        23
    iffi  
       2019-09-24 14:21:09 +08:00
    SonarLint 飘过
    zek
        24
    zek  
       2019-09-24 15:08:31 +08:00
    虽然看着难受,但是真没时间管它
    way2create
        25
    way2create  
       2019-09-24 15:23:09 +08:00
    我觉得 jb 家的错误呈现方式挺好的,vscode 插件那种挺烦的,有些 warning 又不是错误 仅仅是没检测到 自己的项目还好 看别人的老项目就特烦了 也不可能一个个去弄 有些也没必要弄
    shanlan
        26
    shanlan  
       2019-09-24 15:45:28 +08:00
    接手遗留的项目,满屏幕的黄点点、波浪线,WebStorm
    pwrliang
        27
    pwrliang  
       2019-09-24 15:49:57 +08:00
    +1,Idea 的 check 真的很好。除非那种带范型的类型强转检查的话一般我不会 fix,其他的都会 fix。
    l8g
        28
    l8g  
       2019-09-24 15:52:01 +08:00
    黄的我一般能处理的都会处理掉,关掉简直就是掩耳盗铃。
    fvckDaybyte2
        29
    fvckDaybyte2  
       2019-09-24 16:14:23 +08:00 via iPhone
    扫黄小组?
    liuhuansir
        30
    liuhuansir  
       2019-09-24 16:24:10 +08:00
    @shanlan webstorm 不太准,可能是因为 js 是动态语言吧,很多波浪线根本没法解决,比如 Unresolved variable xxx 这种
    gIrl1990
        31
    gIrl1990  
       2019-09-24 16:55:17 +08:00
    这就是偏洁癖或者强迫症那一类了
    FightForFreedom
        32
    FightForFreedom  
       2019-09-24 16:58:39 +08:00
    有一说一,阿里的检查插件,一些检查出的错误想 suppressWarning 都 suppress 不了
    hitoriga
        33
    hitoriga  
       2019-09-24 17:17:40 +08:00
    有个段子,说的是电梯井在维修,门敞着,门口放着个牌子上面写着"ERROR",有个路人觉得很奇怪说这么危险的东西怎么才放个 error 在这里啊,拿了个 WARNING 牌子把原本的替换掉了。

    于是当天好多程序员掉下去摔死了
    aguesuka
        34
    aguesuka  
       2019-09-24 19:05:06 +08:00 via Android
    1.用构造方法注入。2.如果是单个项目,按照 idea 的做不会有问题。如果是要打成 jar 包,用接口。4 拼写错误 alt+回车可以保存单词,代码重复十有八九可以抽象,5.这种警告让我学了不少东西。
    starsriver
        35
    starsriver  
       2019-09-24 19:20:44 +08:00 via Android
    我直接在控制器里面噜 sql,一片黄。懒得分模块。
    0NF09LJPS51k57uH
        36
    0NF09LJPS51k57uH  
       2019-09-24 19:25:32 +08:00
    @xuanbg 我们团队严禁使用 Executors 的任何 new 线程池方法,我们的业务量比较大,不指定队列长度很有可能会 OOM
    magiclz233
        37
    magiclz233  
       2019-09-24 19:26:45 +08:00
    mybatis mapper.xml 里面全部飘黄,是不是也得改。本来就测试 Executors 想快点敲一个线程池,在那飘黄。无语了
    Varobjs
        38
    Varobjs  
       2019-09-24 19:27:10 +08:00 via Android
    phpstorm 也是会提示很多 warn 什么的
    有的人就是不管。看别人代码难受
    比如 写 很多 if else 每个分支定义相同变量,但有的分支会漏掉,IDE 就可以提示。
    同样用 IDE 真烦有人写出来的,跟 text editor 写出来的一样。

    还有代码格式化问题, 随手一个 Ctrl + Alt + l,Ctrl + Alt + o 很难吗
    Varobjs
        39
    Varobjs  
       2019-09-24 19:28:45 +08:00 via Android
    @aguesuka alt + 回车 真好用,然而 很多人不知道。
    jaylee4869
        40
    jaylee4869  
       2019-09-24 19:29:23 +08:00
    扫黄!问一下你们 @Autowired 注入的时候,是改成构造注入吗?
    xuanbg
        41
    xuanbg  
       2019-09-24 19:37:59 +08:00
    2.0 后就不用 @Autowired 了,构造方法参数自动注入挺好的
    yanguangs
        42
    yanguangs  
       2019-09-24 19:42:45 +08:00
    @magiclz233 你没有在 idea 里面链接数据库吧?
    oneisall8955
        43
    oneisall8955  
       2019-09-25 07:44:56 +08:00 via Android
    配合阿里的插件,扫除更多的飘黄我就很烦,自己打的新的代码,硬生生改成没有黄色才舒服。
    xaplux
        44
    xaplux  
       2019-09-25 08:53:55 +08:00 via Android
    代码洁癖,不允许飘黄,确实没有问题的情况就把对应的警告提示关闭
    burnbrid
        45
    burnbrid  
       2019-09-25 09:59:20 +08:00
    社区版本会飘黄吗? idea 这么好用啊 ?社区版本会飘黄吗,社区版本会飘我也下载一个区。
    lzh414895156
        46
    lzh414895156  
       2019-09-27 16:47:44 +08:00
    强迫症的我表示代码里没有一个飘黄...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2817 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 03:24 · PVG 11:24 · LAX 19:24 · JFK 22:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.