2015-05-09 88 views
1

在Java中,我使用了使用註釋的「空分析」。我不使用Eclipse的默認註釋,並且我已經定義了我的擁有者。在Java8中使用空分析註釋

對於每個包,我用於在package-info.java文件中添加一個全局NonNullByDefault註釋。

使用Java版本< = Java7,下面的代碼沒有問題,一切正常。

@my.package.annotations.NonNullByDefault 
package my.foo.package; 

但是,當我設置的Eclipse是Java8兼容的(我的系統上安裝的唯一JDK是Java8),然後出現錯誤:

默認NULL的含量標註尚未爲包指定my.foo.package - Java的問題

我的註釋按以下方式聲明:

@Retention(RetentionPolicy.CLASS) 
@Target({ ElementType.PACKAGE, ElementType.TYPE, 
      ElementType.METHOD, ElementType.CONSTRUCTOR }) 
public @interface NonNullByDefault { 
    // marker annotation 
} 

Java8中有什麼新東西呢?有人能解釋我使用我的註釋的好方法嗎?

+0

請提供'NonNullByDefault'註釋的完整定義。 –

+0

註解僅用於檢查它是否存在。沒有代碼。 @Retention(RetentionPolicy.CLASS) @Target({ElementType.PACKAGE,ElementType.TYPE,ElementType.METHOD,ElementType。CONSTRUCTOR}) 公共@interface NonNullByDefault { \t //標記註釋 } 而且它工作正常使用Java7遵守 – hiveship

回答

0

可否請您嘗試以下操作:

  1. 將一個文件名package-info.java您的每一個的Java包
  2. 在文件中輸入以下內容:

    @NonNullByDefault package your.package; import org.eclipse.jdt.annotation.NonNullByDefault;

這將指定您不希望在任何參數和任何地方接受null你也不會在代碼中加載@NonNull。如果您創建了新軟件包但忘記複製文件,則可能會收到類似A default nullness annotation has not been specified for the package my.foo.package的警告。

+0

這正是我已經做的事情。我正確使用我自己的註釋,而不是org.eclipse.jdt.annotation.NonNullByDefault。我的代碼使用Java7合規性沒有問題。 – hiveship

+0

好的。它應該工作,因爲當我有類似的問題,這是我做了,它爲我工作。無論如何,我可能沒有發現任何其他問題。 –

1

JDT自己的註釋在org.eclipse.jdt.annotation的1.x和2.x版本之間有很大變化。爲了充分利用Java 8中類型註釋的更高精度,@NonNullByDefault現在具有DefaultLocation[]類型的屬性,指定默認應應用的位置。

用相同級別的細節重建您自己的註釋並使JDT瞭解您自己的註釋會很麻煩。

不過,無屬性@NonNullByDefault應該以「默認」方式來理解(請參閱默認值org.eclipse.jdt.annotation.NonNullByDefault.value)。顯然在評估Java 8項目中的這些自定義註釋時有a bug

+0

謝謝。任何關於如何解決它的想法? – hiveship