2017-04-12 321 views
2

我曾嘗試註釋字段與@NotNull,@Nonnull等都不在IntelliJ IDEA的工作

  • org.checkerframework.checker.nullness.qual.NonNull
  • org.jetbrains.annotations .NotNull
  • javax.annotation.Nonnull

而且在所有的情況下,分配一個空它不會產生來自的IntelliJ 2016.2投訴。

public class GreetingController { 
    @NotNull Integer x = 3; 
    public void foo() { x = null; } 
} 

根據IntelliJ所有編譯好。

This page from IntelliJ明確指出「IntelliJ IDEA即時突出顯示問題」,因此您可以在編輯器中看到檢查結果。「我甚至已將示例代碼(public class TestNullable)複製到我的編輯器中,並且不會產生任何錯誤。

This other page from IntelliJ聲明您可以更改其響應的註釋。所以我選擇了javax.annotation.Nonnull,並確保它是我在代碼中使用的那個,但仍然沒有運氣。

要清楚,我期望什麼,我應該提供什麼,是編輯器窗口/編譯器警告我的問題(我不是在尋找運行時檢查,NullPointerException已正常工作運行時。)

如果它沒有實時工作,我嘗試了「重建項目」。

我確定這個必須工作,我做錯了什麼?

我已經上傳了一個這裏不起作用的例子:ZIP download

+0

您是否啓用了[此檢查](http://i.imgur.com/N2BYJFX.png)?你能顯示編輯器的截圖(完整的IDE窗口)嗎?我[無法重現問題](http://i.imgur.com/BO91a3a.png)。可能是錯誤配置的項目,例如源文件根目錄之外的Java文件,禁用了檢查,啓用了節能模式等。共享[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)將有助於很多。 – CrazyCoder

+0

@CrazyCoder我已經在這裏上傳了一個例子:https://www.databasesandlife.com/not-null.zip我是新來的IntelliJ(今天開始),請讓我知道,如果我已經出口不是正確的東西讓你導入項目。我有一個使用'javax.annotation.Nonnull'的源文件。從屏幕截圖中可以看到,檢查已啓用,powersave未啓用,但沒有顯示警告/錯誤。 (另外''org.jetbrains.annotations.NotNull'也是一樣的。) –

+0

正如我從截圖和示例項目中可以看到的那樣,IntelliJ IDEA [向您顯示警告](http://i.imgur.com/ 484n68P.png)。請注意,這些警告通過正在運行的代碼檢查來顯示,並將顯示在編輯器或Analyze |檢查代碼結果。這些警告不會被編譯器顯示。 – CrazyCoder

回答

3

從我的截圖和示例項目IntelliJ IDEA does show you the warnings中可以看到。請注意,這些警告通過正在運行的代碼檢查來顯示,並將顯示在編輯器或Analyze |檢查代碼結果。這些警告不會被編譯器顯示。

warning

請注意,您可以配置警告,如果需要突出(例如添加underwave效果):

warning

你也可以改變檢查的嚴重程度(等中的錯誤):

severity

你可能還需要投票支持此功能要求:

  • IDEA-78625提供檢查嚴重程度,將工作如驗證並中止編譯

作爲獎勵,注重javax.annotation.Nullable註釋,也可能是不你認爲它的用途,請參閱this commentdocumentation。這些年來,IntelliJ IDEA的不正確地建議使用此批註,而正確的這類案件會javax.annotation.CheckForNull

此註釋是來推翻Nonnull註釋最有用。 靜態分析工具通常應該將帶註釋的項目視爲 ,儘管它們沒有註釋,除非它們被配置爲最大程度減少 漏報。使用CheckForNull指示總是應檢查元素值 的空值。

0

最好這可以做的是提供警告。它不會停止編譯,因爲註釋並不禁止或阻止代碼編譯的發生。

確保您在IDE中啓用了適當的檢查,並確保您仍然知道您傳遞給您的方法的參數。 IDE最多可以警告你,但它並不能阻止你。

或者,如果該方法接收到空參數,則引入單元測試失敗,並依靠它來確保不會破壞代碼或期望值。