IDEA代码警告(warning)整理以及解决办法
背景
在日常开发中,IDEA
可能会通过下方的problems
窗口以及编辑窗口最右方的黄色标记提示给我们一些警告:
或者向git
提交commit时同样有可能提示警告:
大多数情况下,无视这些警告并不会影响我们的程序结果,但却说明了我们的代码或多或少有一些问题,还有优化的空间,也有可能有潜在的风险,而且有强迫症同学同样也不想看到这些警告。这篇文章整理了我在平时开发中遇到的一些IDEA警告,以便后续碰到同样的问题可以作为参考。
注意:不是所有警告都需要处理,需要自行判断是否有处理的必要。(如我们对变量进行了缩写,而IDEA认为是一个错误的单词)。
如何检查代码
默认情况下,problems
窗口的Current File
页签中会展示的当前文件的错误以及警告等。如果想查看整个项目、某一模块或某个条件下的文件时,需要依次点击最上方菜单栏上的Code
-> Inspect Code
在弹出的窗口中可以选择检查哪些文件的代码,如整个项目,某个模块,未提交的文件等,也可以自己配置检查哪些项:
警告分析
X can be simplified to Y
原因:写法比较啰嗦,有简化写法。
public class Demo {boolean result;public boolean test() {return result == true;}
}
// 'result == true' can be simplified to 'result'
解决办法:
按照提示将X修改为Y即可。
public class Demo {boolean result;public boolean test() {// 直接返回布尔值即可。return result;}
}
‘OptionalInt.getAsInt()’ without ‘isPresent()’ check
Pattern pattern = Pattern.compile("^(" + name + "\\()(\\d+)(\\))$");
int max = apps.stream().mapToInt(app -> {Matcher matcher = pattern.matcher(app.getName());if (matcher.find()) {// 取第二部分表示版本号String group = matcher.group(2);// 正则表达式过滤都数字,不用担心转换异常return Integer.parseInt(group);}return 1;}).max().getAsInt();
return max + 1;
示例代码中,apps为一个对象列表,经过一些列处理变为某个int值最后取最大值。提示的原因是因为map中有if的判断,所以有可能全部不匹配,此时max()可能返回一个类似Optional为空的一个东西,需要进行类似处理,将getAsInt改为orElse即可
Pattern pattern = Pattern.compile("^(" + name + "\\()(\\d+)(\\))$");
int max = apps.stream().mapToInt(app -> {Matcher matcher = pattern.matcher(app.getName());if (matcher.find()) {// 取第二部分表示版本号String group = matcher.group(2);// 正则表达式过滤都数字,不用担心转换异常return Integer.parseInt(group);}return 1;}).max()// 给一个默认值.orElse(1);
return max + 1;
Iteration can be replaced with bulk ‘Collection.addAll’ call
原因:采用循环一个一个向集合中添加,比较麻烦。
List<String> list1 = new ArrayList();
List<String> list2 = xxxx;
for (String str : list2) {list1.add(str);}
解决办法:使用addAll
方法。
List<String> list1 = new ArrayList();
List<String> list2 = xxxx;
list1.addAll(list2);
More arguments provided (1) than placeholders specified (0)
为SLF4J日志功能的警告
...LOGGER.error("user {0} is not found ", userId);
...
问题分析:
SL4FJ
中占位符不像MessageFormat
需要指定index,而是直接使用{}
即可
解决办法:直接使用{}
...LOGGER.error("user {} is not found ", userId);
...
Call to ‘asList()’ with only one argument
原因:使用Arrays.asList
时只向其中添加了一个元素。
List<String> list = Arrays.asList("a");
解决方法:使用Collections.singletonList
代替
List<String> list = Collections.singletonList("a");
Raw use of parameterized class xx
原因:一般为没有指定泛型
例1:如有一个类定义为
public class ResponseDto<T> {}
在实例化的时候按照如下所示
ResponseDto<String> response = new ResponseDto();
虽然引用加上了泛型,但是对象没有加泛型,此时就会出现警告
解决方法:在对象上也加上泛型,但是无需写全部,只需写<>
即可,否则IDE会觉得多余并发出警告
// 无需写全
// ResponseDto<String> response = new ResponseDto<String>();
ResponseDto<String> response = new ResponseDto<>();
例2:在单元测试中使用mockito来虚拟一个feign客户端时,如果参数为list那么会按照如下方式虚拟
XXClient client = mock(XXClient.class);
when(client.listByIds(anyList())).thenAnswer(invocation -> {// Do something
}
此时IDE会给予警告
因为我们的接口参数指定了list的泛型
List<XX> listByIds(List<Long> ids);
但是mock时调用的方法anyList
的返回值并没有指定泛型
所以IDE给出警告
解决办法:调用mockito中提供的其他可以指定泛型的方法,如
when(client.listByIds(anyListOf(Long.class))).thenAnswer(invocation -> {...
}
Passing a non-null argument to ‘Optional’
原因:向Optional.ofNullable
传递一个非null
对象。
User user = xxxx;
if (user != null) {Optional.ofNullable(user).xxx;
}
解决办法,如果可以明确对象非null,则直接使用of
。
User user = xxxx;
if (user != null) {Optional.of(user).xxx;
}
Method ‘xx()’ recurses infinitely, and can only end by throwing an exception
原因:提示为无限递归,只能通过触发异常的方式结束。
public void method1() {method1();
}
解决办法:
一般来说为错误的调用了自己(如想调用重载的其他方法,最后由于马虎又重新调用了自己),或是递归方法写的有问题,需要具体检查代码。
‘if’ statement replaceable with ‘switch’ statement
原因:为if…else…判断条件太多导致,IDEA
认为应该替换为swtich
语句
if (condition1) {// Do something
} else if (condition2) {// Do something
} else if (condition3) {// Do something
} else if (condition4) {// Do something
} else if (condition5) {// Do something
} else if (condition6) {// Do something
} else {// Do something
}
解决办法:建议通过表驱动、多态、设计模式等方式消除这么多的判断,如果不得不进行判断,那么可以根据提示修改为switch
。
switch(xxx) {case condition1:xxx;break;case condition2:xxx;break;...
}
Result of ‘XX’ is ignored
原因:调用一个有返回值的方法,但是没有使用该返回值。
File folder = new File("xx");
if (!folder.exists()) {folder.mkdir();
}
由于mkdir()
方法会返回boolean
类型的返回值,但是我们没有使用,所以编译器会报出警告。
解决办法:可以使用返回值输出一些日志等,如果实在不想使用返回值,那么可以在方法上标注以下注解来压制警告。
@SuppressWarnings("ResultOfMethodCallIgnored")
Statement lambda can be replaced with expression lambda
users.forEach(u -> {u.setState(xxx);
})
当有以上写法时会有警告,可以看出lambda表达式方法体内只有一行代码,此时可以将花括号去掉进行简写
解决办法:去掉大括号
users.forEach(u -> u.setState(xxx))
Lambda can be replaced with method reference
names.stream().map(n -> n.toUpperCase())...
当有如上写法时会出现警告。
解决办法:可以替换为方法调用的简写形式
names.stream().map(String::toUpperCase)...
Condition ‘x != null’ covered by subsequent condition ‘x instanceof List’
原因:后面的判断条件包含了前面的判断条件
public boolean test(Object obj) {if (obj != null && obj instanceof String) {// Do sth...}}
上例中,如果obj
为null
,则自然obj instanceof String
为false
,所以不用重复判断
解决办法:去掉多余判断
public boolean test(Object obj) {if (obj instanceof String) {// Do sth...}}
Actual value of parameter ‘xxx’ is always ‘yyy’
原因:调用某个方法时,某个参数的值目前来说一直是固定的一个值。
解决办法:
- 考虑是否一直是固定值,如果是,则将传参改为局部变量或常量等。
- 如果该参数确实需要传递,只不过目前来说是一个值,将来不确定,可以考虑将其压制
@SuppressWarnings("SameParameterValue")
Unchecked generics array creation for varargs parameter
解决办法:在方法上添加注解
@SafeVarargs
IDEA代码警告(warning)整理以及解决办法相关推荐
- QtCreator 编译时提示 warning C4819 的解决办法
QtCreator 编译时提示 warning C4819 的解决办法 用 QtCreator 和Visual C++ 编译器编译程序时经常会出现类似的警告: warning C4819: 该文件包含 ...
- c语言0xa9错误,16种C语言编译警告(Warning)类型的解决方法
当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息.警告信息可能意味着程序中隐含的大错误,也可能确实没有问题.对于警告的正确处理方式应该是:尽可能地消除之.对于编译程序给出的每个警告 ...
- warning LNK4070的解决办法
warning LNK4070的解决办法 重命名了一个MFC常规DLL的工程文件(VS C++ 2005编译环境),结果在编译时出现这样的警告:1>B.exp : warning LNK4070 ...
- 【Python教程】Jupyter Notebook把一段很长的代码分成多行的解决办法
Jupyter Notebook把一段很长的代码分成多行的解决办法 使用Jupyter Notebook时经常会遇到一段代码很长 导致代码块向右边延伸了很多 感觉 很! 不! 方! 便! 所以就想把这 ...
- python modulenotfounderror_python 服务器运行代码报错ModuleNotFoundError的解决办法
一.问题描述 一段 Python 代码在本地的 IDE 上运行正常,部署到服务器运行后,出现了 ModuleNotFoundError: No module named 'xxx" 错误. ...
- SAS中修改一个表为编辑模式的时候不成功并给出警告的原因及解决办法
今天看朱世武老师的<SAS编程技术教程>一书的时候,遇到一个问题,就是在SAS中打开一张表之后,右击Edit Mode,弹出了下面的警告框: 并且表格不能切换到编辑模式.经过在谷歌中搜索一 ...
- 几个常用的CSS3样式代码以及不兼容的解决办法
几个常用的CSS3样式代码以及不兼容的解决办法 原文:几个常用的CSS3样式代码以及不兼容的解决办法 border-radius实现圆角效果 1 CSS3代码: 2 3 -webkit-border- ...
- GitLabCICD实战----在.gitlab-ci.yml文件的步骤中使用git clone 另一个代码仓报错的解决办法
更多信息请关注 个人网站 一.背景 在有些时候,比如在一个项目中,产品的代码是java代码仓,自动化测试脚本是python语言,单独存放的代码仓,在使用GitlabCICD构建流水线的时候有这样一种场 ...
- sublime text3使用卡顿,代码提示卡顿终极解决办法
sublime text3使用卡顿,代码提示卡顿终极解决办法 适用的情况 解决办法 适用的情况 原来sublime text3好好地不卡顿,突然有一天卡顿了. 应该是最近装了什么插件导致的 解决办法 ...
最新文章
- 花了两天,终于把 Python 的 setup.py 给整明白了
- 项目中除了需求外还需要知道的问题
- 每天一道LeetCode-----判断某棵树是否是二叉搜索树
- OMNet++ 4.0
- 微软服务器问题,微软服务器内存溢出问题 | 【韩涛博客】
- 2010-04-25 搞定aftr
- 95.91p30.space\/index.php,关于 ThinkPHP6 分页样式的定制及点击下一页搜索条件丢失的解决方法...
- Spring Cloud Data Flow 2.0.1 GA 发布
- 计算机视觉常用图像软件对比和分析
- 计算机为什么老是重启,为什么电脑开机后总是自动重启?电脑开机后自动重启怎么办?...
- 药品集中采购系统mysql数据库数据_浙江省药品集中采购基础数据库资料申报说明及具体要求...
- [CSS基础]在一个网页中使用多种不同链接风格的CSS.
- uni-app App端配置urlSchemes
- 对Word文档中的指定内容进行替换
- 用ZXING生成二维码的工具类(可以去掉白边,添加logo)
- chai.js------使用
- 10个最受欢迎的JavaScript图表库
- android 模拟器监听短信,android模拟器用命令和DDMS模拟来电和短信(示例代码)
- dell服务器显示器fre,戴尔发布Gaming 24/27游戏显示器新品 支持144/155Hz FreeSync
- # BJTUOJ 一颗姜会长多高? (二分+前缀和+简单贪心)