android lint中的probable bugs

什麼是 Lint

Lint 是Android Studio 提供的 代碼掃描分析工具,它可以幫助我們發現代碼結構/質量問題,同時提供一些解決方案,而且這個過程不需要我們手寫測試用例。

Android Studio 中內置了 Lint,Lint 的使用路徑:

工具欄 -> Analyze -> Inspect Code

檢測工具介紹


1、

Parameter annotated @NonNull must not override @Nullable parameter

註解@NonNull的參數不能重寫@Nullable參數

Not annotated method overrides method annotated with @NonNull

未注釋的方法重寫用@NonNull注釋的方法

@NotEmpty、@NotBlank、@NotNull的區別

@NotEmpty 用在集合類上面

@NotBlank 用在String上面

@NotNull 用在基本類型上

NotEmpty

其String類、Collection、Map、數組,是不能為null或者長度為0的(String、Collection、Map的isEmpty()方法)。

NotBlank

和{@code NotEmpty}不同的是,尾部空格被忽略純空格的String也是異常。@NotBlank用於String。

NotNull

是不能為null

@NotNull的問題是不能檢查".空字元串長度為0,還是用@NotEmpty

這些註解是用來標註方法是否能傳入null值,如果可以傳入NUll值,則標記為nullbale,如果不可以則標註為Nonnull. 在我們做了一些不安全嚴謹的編碼操作的時候,這些注釋會給我們一些警告。比如說

方法是要傳入String的類型,調用中傳入了null,系統卻沒有任何提示,造成潛在錯誤。

添加註釋NonNull後,調用方法傳入null後系統便會彈出警告

怎麼生成@Nullable和NotNull?

Android studio中的Infer Nullity變可以生成相應的注釋。

例如:

public void startAnim(@NonNull final View view, @Nullable PointF startP, @NonNull PointF stopP, @Nullable Bundle savedInstanceState){

}

public class NoFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_nochat,null,false); return view; }}


Result of File.mkdir() is ignored

File.mkdir()的結果被忽略

File.mkdir()方法有個返回值,編輯器編譯的時候發現沒有對這個返回值進行檢查

Stack Overflow解決如下:

boolean wasSuccessful = myDir.mkdirs();

if (!wasSuccessful) {

System.out.println("was not successful.");

}

或者添加註釋,忽略這個警告

@SuppressWarnings("all")

在方法的前面添加所有警告忽略


關於注釋的拓展

其實這兩個注釋都是從Android支持註解庫中獲取到的,在這個庫中還有其他一些更好的注釋:

@CheckResult

該注釋是來告訴我們該方法的返回值類型是我們預計要使用的,而不是錯誤效果的方法:

可以看到,添加了這個注釋後,系統會提示你所傳入的參數格式是錯誤的(普通的提示只會分辨出是否傳入的是String)

@StringRes 與 @DrawableRes 等等

你是不是在TextView上調用setText方法,經常會出現莫名其妙的異常java android.content.res.Resources$NotFoundException: String resource ID #0x3039? 如果設置了一個整型數給setText,TextView會假定這個整型數是一個字元串的資源id,為了設置string文本將會查詢這個整數。對於整型數是無效的資源id的問題,可以通過@StringRes 註解來補救。


推薦閱讀:

TAG:Bug | AndroidStudio | 異常檢測 |