最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IDEA代碼警告(warning)整理以及解決方案

 更新時間:2024年10月06日 15:29:50   作者:筆墨桑  
在日常開發(fā)中,IntelliJ?IDEA會通過problems窗口和編輯窗口的黃色標記提示警告,這些警告可能指示代碼存在潛在風險或需要優(yōu)化的空間,文章介紹了如何利用IDEA檢查代碼,以及針對常見警告的原因和解決辦法

背景

在日常開發(fā)中,IDEA可能會通過下方的problems窗口以及編輯窗口最右方的黃色標記提示給我們一些警告:

或者向git提交commit時同樣有可能提示警告:

大多數(shù)情況下,無視這些警告并不會影響我們的程序結(jié)果,但卻說明了我們的代碼或多或少有一些問題,還有優(yōu)化的空間,也有可能有潛在的風險,而且有強迫癥同學同樣也不想看到這些警告。這篇文章整理了我在平時開發(fā)中遇到的一些IDEA警告,以便后續(xù)碰到同樣的問題可以作為參考。

注意:不是所有警告都需要處理,需要自行判斷是否有處理的必要。(如我們對變量進行了縮寫,而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);
        // 正則表達式過濾都數(shù)字,不用擔心轉(zhuǎn)換異常
        return Integer.parseInt(group);
      }
      return 1;
    })
    .max()
    .getAsInt();
return max + 1;

示例代碼中,apps為一個對象列表,經(jīng)過一些列處理變?yōu)槟硞€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);
        // 正則表達式過濾都數(shù)字,不用擔心轉(zhuǎn)換異常
        return Integer.parseInt(group);
      }
      return 1;
    })
    .max()
    // 給一個默認值
    .orElse(1);
return max + 1;

Iteration can be replaced with bulk ‘Collection.addAll’ call

原因:采用循環(huán)一個一個向集合中添加,比較麻煩。

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();

雖然引用加上了泛型,但是對象沒有加泛型,此時就會出現(xiàn)警告

解決方法:在對象上也加上泛型,但是無需寫全部,只需寫<>即可,否則IDE會覺得多余并發(fā)出警告

// 無需寫全
// ResponseDto<String> response = new ResponseDto<String>();
ResponseDto<String> response = new ResponseDto<>();

例2:在單元測試中使用mockito來虛擬一個feign客戶端時,如果參數(shù)為list那么會按照如下方式虛擬

XXClient client = mock(XXClient.class);
when(client.listByIds(anyList())).thenAnswer(invocation -> {
 // Do something
}

此時IDE會給予警告

因為我們的接口參數(shù)指定了list的泛型

List<XX> listByIds(List<Long> ids);

但是mock時調(diào)用的方法anyList的返回值并沒有指定泛型

所以IDE給出警告

解決辦法:調(diào)用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

原因:提示為無限遞歸,只能通過觸發(fā)異常的方式結(jié)束。

public void method1() {
  method1();
}

解決辦法:

一般來說為錯誤的調(diào)用了自己(如想調(diào)用重載的其他方法,最后由于馬虎又重新調(diào)用了自己),或是遞歸方法寫的有問題,需要具體檢查代碼。

‘if’ statement replaceable with ‘switch’ statement

原因:為if…else…判斷條件太多導致,IDEA認為應(yīng)該替換為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
}

解決辦法:建議通過表驅(qū)動、多態(tài)、設(shè)計模式等方式消除這么多的判斷,如果不得不進行判斷,那么可以根據(jù)提示修改為switch

switch(xxx) {
  case condition1:
    xxx;
    break;
   case condition2:
    xxx;
    break;
   ... 
}

Result of ‘XX’ is ignored

原因:調(diào)用一個有返回值的方法,但是沒有使用該返回值。

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表達式方法體內(nèi)只有一行代碼,此時可以將花括號去掉進行簡寫

解決辦法:去掉大括號

users.forEach(u -> u.setState(xxx))

Lambda can be replaced with method reference

names.stream().
  map(n -> n.toUpperCase())
  ...

當有如上寫法時會出現(xiàn)警告。

解決辦法:可以替換為方法調(diào)用的簡寫形式

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...
    }
  }

上例中,如果objnull,則自然obj instanceof Stringfalse,所以不用重復判斷

解決辦法:去掉多余判斷

public boolean test(Object obj) {
  if (obj instanceof String) {
      // Do sth...
    }
  }

Actual value of parameter ‘xxx’ is always ‘yyy’

原因:調(diào)用某個方法時,某個參數(shù)的值目前來說一直是固定的一個值。

解決辦法:

  1. 考慮是否一直是固定值,如果是,則將傳參改為局部變量或常量等。
  2. 如果該參數(shù)確實需要傳遞,只不過目前來說是一個值,將來不確定,可以考慮將其壓制
@SuppressWarnings("SameParameterValue")

Unchecked generics array creation for varargs parameter

解決辦法:在方法上添加注解

@SafeVarargs

XXX is deprecated

原因:調(diào)用某個標記為@Deprecated方法或?qū)傩詴r,會報此警告。意為提示調(diào)用者這是個過時的方法或?qū)傩?,再未來的某個版本有可能會消失,不應(yīng)該調(diào)用該方法。

但是某種情況下我們確實需要調(diào)用過時的方法,比如我們開發(fā)工具類需要兼容老版本,或我們將一個方法標記了過時之后,單元測試依舊調(diào)用此方法。

解決辦法:

  • 如果可能的話,嘗試使用替代方法。一般來說在此方法的Javadoc中指引出新的方法。
  • 如果確實需要調(diào)用過時的方法或?qū)傩?,可以考慮將其壓制
@SuppressWarnings("deprecation")

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java代碼實現(xiàn)隨機生成漢字的方法

    Java代碼實現(xiàn)隨機生成漢字的方法

    今天小編就為大家分享一篇關(guān)于Java代碼實現(xiàn)隨機生成漢字的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Spring Bean生命周期源碼原理圖解

    Spring Bean生命周期源碼原理圖解

    這篇文章主要介紹了Spring Bean生命周期源碼原理圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot 自動掃描第三方包及spring.factories失效的問題解決

    SpringBoot 自動掃描第三方包及spring.factories失效的問題解決

    這篇文章主要介紹了SpringBoot 自動掃描第三方包及spring.factories失效的問題,本文給大家分享最新解決方法,需要的朋友可以參考下
    2023-05-05
  • SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式

    SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式

    這篇文章主要介紹了SpringBoot異步線程父子線程數(shù)據(jù)傳遞的5種方式,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • Java使用WebFlux調(diào)用大模型實現(xiàn)智能對話

    Java使用WebFlux調(diào)用大模型實現(xiàn)智能對話

    這篇文章主要為大家詳細介紹了Java如何使用WebFlux調(diào)用大模型實現(xiàn)智能對話效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-06-06
  • 詳解Java如何跨平臺獲取MAC地址

    詳解Java如何跨平臺獲取MAC地址

    有時我們因為軟件授權(quán)或者其它需要獲取主機唯一標識而需要獲取用戶主機的MAC地址,而本文則將介紹如何通過Java來實現(xiàn)跨平臺獲取MAC地址的兩種方法,需要的朋友可以參考下
    2021-06-06
  • 深入探究Spring IOC和DI的區(qū)別

    深入探究Spring IOC和DI的區(qū)別

    很多人都會把ioc和di說成同一個東西,其實IOC和DI雖然在概念上可以籠統(tǒng)地視為同一事物,但其本質(zhì)上存在區(qū)別,因此,我們希望能夠更加嚴謹?shù)貐^(qū)分這兩個概念,以更好地理解和應(yīng)用它們,需要的朋友可以參考閱讀本文
    2023-10-10
  • 教你用JAVA寫文本編輯器(一)

    教你用JAVA寫文本編輯器(一)

    對于學習java編程的小伙伴們,常常需要編寫一個類似文本編輯器的東西,下面這篇文章主要給大家介紹了關(guān)于如何用JAVA寫文本編輯器的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • java單元測試JUnit框架原理與用法實例教程

    java單元測試JUnit框架原理與用法實例教程

    這篇文章主要介紹了java單元測試JUnit框架原理與用法,結(jié)合實例形式較為詳細的分析了java單元測試JUnit框架的概念、原理、使用方法及相關(guān)注意事項,需要的朋友可以參考下
    2017-11-11
  • SpringBoot自定義雪花算法生成ID的實現(xiàn)示例

    SpringBoot自定義雪花算法生成ID的實現(xiàn)示例

    雪花算法是一種生成唯一ID的分布式算法,它能生成不重復的、有時間順序的全局唯一ID,本文主要介紹了SpringBoot自定義雪花算法生成ID的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2025-04-04

最新評論

马山县| 郓城县| 贵州省| 伊春市| 镇巴县| 巩义市| 云和县| 神池县| 资溪县| 噶尔县| 长泰县| 雅江县| 丰顺县| 江华| 商水县| 交城县| 孝义市| 韩城市| 本溪市| 巴马| 长岛县| 枝江市| 奉贤区| 营口市| 南京市| 库伦旗| 昂仁县| 潮安县| 贵南县| 盐津县| 曲松县| 城口县| 鄂尔多斯市| 石棉县| 沧州市| 宝清县| 镇巴县| 东阿县| 紫金县| 铜山县| 乐昌市|