導航:首頁 > 操作系統 > findbugsandroid

findbugsandroid

發布時間:2022-06-14 05:39:44

A. java中的空指針異常怎麼解決

原文:https://www.hu.com/question

你這個問題的解決

問題定位:

在堆棧異常信息的第一行就可以定位到是哪裡出了空指針,倘若這里不是你寫的類,可以往下翻一下,找到你寫的類,就是這里出現的空指針。

問題解決:

對一個空對象調用裡面的方法或者屬性的時候會報空指針,檢查這個對象為什麼是空即可。

Java 空指針異常的若干解決方案

Java 中任何對象都有可能為空,當我們調用空對象的方法時就會拋出 NullPointerException 空指針異常,這是一種非常常見的錯誤類型。我們可以使用若干種方法來避免產生這類異常,使得我們的代碼更為健壯。本文將列舉這些解決方案,包括傳統的空值檢測、編程規范、以及使用現代 Java 語言引入的各類工具來作為輔助。

運行時檢測

最顯而易見的方法就是使用 if (obj == null) 來對所有需要用到的對象來進行檢測,包括函數參數、返回值、以及類實例的成員變數。當你檢測到 null 值時,可以選擇拋出更具針對性的異常類型,如 IllegalArgumentException,並添加消息內容。我們可以使用一些庫函數來簡化代碼,如 Java 7 開始提供的 Objects#requireNonNull 方法:

public void testObjects(Object arg) {
Object checked = Objects.requireNonNull(arg, "arg must not be null");
checked.toString();}

Guava 的 Preconditions 類中也提供了一系列用於檢測參數合法性的工具函數,其中就包含空值檢測:

public void testGuava(Object arg) {
Object checked = Preconditions.checkNotNull(arg, "%s must not be null", "arg");
checked.toString();
}

我們還可以使用 Lombok 來生成空值檢測代碼,並拋出帶有提示信息的空指針異常:

public void testLombok(@NonNull Object arg) {
arg.toString();

生成的代碼如下:

public void testLombokGenerated(Object arg) {
if (arg == null) {
throw new NullPointerException("arg is marked @NonNull but is null");
}
arg.toString();
}

這個註解還可以用在類實例的成員變數上,所有的賦值操作會自動進行空值檢測。

編程規范

·通過遵守某些編程規范,也可以從一定程度上減少空指針異常的發生。

使用那些已經對 null 值做過判斷的方法,如 String#equals、String#valueOf、以及三方庫中用來判斷字元串和集合是否為空的函數:

if (str != null && str.equals("text")) {}
if ("text".equals(str)) {}

if (obj != null) { obj.toString(); }
String.valueOf(obj); // "null"

// from spring-core
StringUtils.isEmpty(str);
CollectionUtils.isEmpty(col);
// from guava
Strings.isNullOrEmpty(str);
// from commons-collections4
CollectionUtils.isEmpty(col);

·如果函數的某個參數可以接收 null 值,考慮改寫成兩個函數,使用不同的函數簽名,這樣就可以強制要求每個參數都不為空了:

public void methodA(Object arg1) {
methodB(arg1, new Object[0]);
}

public void methodB(Object arg1, Object[] arg2) {
for (Object obj : arg2) {} // no null check
}

·如果函數的返回值是集合類型,當結果為空時,不要返回 null 值,而是返回一個空的集合;如果返回值類型是對象,則可以選擇拋出異常。Spring JdbcTemplate 正是使用了這種處理方式:

// 當查詢結果為空時,返回 new ArrayList<>()
jdbcTemplate.queryForList("SELECT * FROM person");

// 若找不到該條記錄,則拋出
jdbcTemplate.queryForObject("SELECT age FROM person WHERE id = 1", Integer.class);

// 支持泛型集合
public <T> List<T> testReturnCollection() {
return Collections.emptyList();
}

靜態代碼分析

Java 語言有許多靜態代碼分析工具,如 Eclipse IDE、SpotBugs、Checker Framework 等,它們可以幫助程序員檢測出編譯期的錯誤。結合 @Nullable 和 @Nonnull 等註解,我們就可以在程序運行之前發現可能拋出空指針異常的代碼。

但是,空值檢測註解還沒有得到標准化。雖然 2006 年 9 月社區提出了 JSR 305 規范,但它長期處於擱置狀態。很多第三方庫提供了類似的註解,且得到了不同工具的支持,其中使用較多的有:

B. 如何在Android Studio中使用java 8

如果你首先是一個Java開發人員,你可能認為Android將完全支持當前版本的Java是公理的。你會錯了。部分原因是由於Oracle的訴訟,部分原因是它不是他們的首要任務,Android在採用當前的Java SE版本時速度很慢。使用Android Nougat(7.0),Android團隊已開始轉向Java(Java 8)的當前版本,但部分和增量。好消息是,Android庫的許多Java兼容部分顯然是基於來自OpenJDK 8的源代碼,因此令人討厭的小不一致的數量應該隨著時間的推移而減少。注意,為了編譯Android
Nougat,您必須安裝Java 8 SDK,即使您沒有使用任何這些功能!
「Jack」(Java編譯工具包?)是一個新的工具鏈,它將Java代碼編譯成自己的格式 - 沒有更多的類文件到Dex翻譯。這應該更快,但也意味著工具像findbugs讀取.class文件將不再工作,沒有額外的編譯步驟。

要使用Jack,您必須具有Android Studio 2.1或更高版本以及Build Tools軟體包24或更高版本。並且必須在build.gradle或模塊設置中將Source和Target編譯級別設置為1.8。另外,從當前預覽,您必須手動添加jackOptions使能條目到build.gradle,在defaultConfig條目內:
android {
defaultConfig {
// Other defaults here...
// Enable 'jack'
jackOptions {
enabled true
}
}
// And if you prefer to set these manually:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

C. 如何提高 Android 代碼質量

(1)插件安裝
在Android Studio中選擇Preferences -> Plugins,輸入查找findBugs進行插件安裝。
(2)插件使用
在build.gradle文件中,按照下面步驟進行設置:
添加plugin apply plugin:』findbugs』
定義任務,指定輸出格式
這里要注意因為findBugs是檢查class文件,所以在定義task的時候,是dependsOn: 「assembleDebug」,確保運行findbugs的task能夠成功檢測。
通過gradle findbugs方式,在工程目錄下運行命令,檢測完成後,會在制定的目錄下生成報告文檔。文檔支持xml和html兩種格式,本文設置的是html格式,可以直接用瀏覽器打開。
當然,和lint一樣,findBugs也支持手動檢測的方式。
在工程里,右鍵 FindBugs -> (選擇檢測的范圍)。檢測完之後,底部工具欄會跳到FindBugs-IEDA下。
3
PMD

PMD是一個很有用的工具,它跟Findbugs類似,但是它不是檢測位元組碼,它是直接檢測源代碼。它使用靜態分析來發現錯誤。

為什麼要將它們同時使用呢?因為它們的檢測方法不同,可以取到互補的作用。

檢測范圍
可能的bug——空的try/catch/finally/switch塊。
無用代碼(Dead code):無用的本地變數,方法參數和私有方法。
空的if/while語句。
過度復雜的表達式——不必要的if語句,本來可以用while循環但是卻用了for循環。
可優化的代碼:浪費性能的String/StringBuffer的使用。

(1)插件安裝

同樣可以通過AS的plugin進行安裝,推薦安裝QAPlug-PMD。

(2)插件使用

在build.gradle文件中進行如下配置

導入Plugin:apply plugin: 『pmd』
Task配置

4
CheckStyles

這個工具用來自動檢測java源碼。啟動之後,可以按照制定的規則對java源碼進行檢查,被將所有的不符合規范的地方生成報告通知給你。

檢測范圍
註解
javadoc注釋
命名規范
文件頭
導入包規范
尺寸設置
空格
正則表達式
修飾符
代碼塊
編碼問題
類設計問題
重復、度量以及一些雜項

總而言之,是一些代碼規范問題!!

(1)插件安裝

通過AS的Plugin進行安裝

(2)插件使用

導入Plugin
apply plugin: 『checkstyle』
設置CheckStyle的版本
checkstyle {
toolVersion 『6.1.1』
showViolations true
}
配置任務

5
插件的接入與使用

檢測范圍
lint、PMD、findBugs和CheckStyle檢測范圍之和。

(1)插件安裝

下載整合插件的文件包(文末),和app工程目錄同級放置。
在app的build.gradle文件導入整合插件腳本
apply from: 『../config/quality.gradle』

(2)插件使用

修改quality.gradle 的appDir欄位,設置檢測的工程目錄
// 應用目錄名稱def appDir = 「app-k12」
進入工程根目錄,運行gradle check,檢測完成後,會在build/reports下生成相應的檢測報告文件。當然也可以按照每個插件的使用方式單獨使用。

D. 有什麼好用的Android Studio的插件值得推薦

1.GsonFormat
快速將json字元串轉換成一個Java Bean,免去我們根據json字元串手寫對應Java Bean的過程。

使用方法:快捷鍵Alt+S也可以使用Alt+Insert選擇GsonFormat
2.Android ButterKnife Zelezny
配合ButterKnife實現註解,從此不用寫findViewById,想著就爽啊。在Activity,Fragment,Adapter中選中布局xml的資源id自動生成butterknife註解。

使用方法:Ctrl+Shift+B選擇圖上所示選項
3.Android Code Generator
根據布局文件快速生成對應的Activity,Fragment,Adapter,Menu。

4.Android Parcelable code generator
JavaBean序列化,快速實現Parcelable介面。

5.Android Methods Count
顯示依賴庫中得方法數

6.Lifecycle Sorter
可以根據Activity或者fragment的生命周期對其生命周期方法位置進行先後排序,快捷鍵Ctrl + alt + K

7.CodeGlance
在右邊可以預覽代碼,實現快速定位

8.findBugs-IDEA
查找bug的插件,Android Studio也提供了代碼審查的功能(Analyze-Inspect Code…)

9.ADB WIFI
使用wifi無線調試你的app,無需root許可權
也可參考以下文章:
Android wifi無線調試App新玩法ADB WIFI

10.AndroidPixelDimenGenerator
Android Studio自動生成dimen.xml文件插件

11.JsonOnlineViewer
在Android Studio中請求、調試介面

12.Android Styler
根據xml自動生成style代碼的插件

Usage:
a. lines with future style from your layout.xml file
b. paste it to styles.xml file with Ctrl+Shift+D (or context menu)
c. enter name of new style in the modal window
d. your style is prepared!
13.Android Drawable Importer
這是一個非常強大的圖片導入插件。它導入Android圖標與Material圖標的Drawable ,批量導入Drawable ,多源導入Drawable(即導入某張圖片各種dpi對應的圖片)

14.SelectorChapek for Android
通過資源文件命名自動生成Selector文件。

15.GenerateSerialVersionUID
實現Serializable序列化bean
Adds a new action 『SerialVersionUID』 in the generate menu (alt + ins). The action adds an serialVersionUID field in the current class or updates it if it already exists, and assigns it the same value the standard 『serialver』 JDK tool would return. The action is only visible when IDEA is not rebuilding its indexes, the class is serializable and either no serialVersionUID field exists or its value is different from the one the 『serialver』 tool would return.
16.genymotion
速度較快的android模擬器

17.LeakCanary
幫助你在開發階段方便的檢測出內存泄露的問題,使用起來更簡單方便。
可以參考以下文章:
LeakCanary 中文使用說明

18.Android Postfix Completion
可根據後綴快速完成代碼,這個屬於拓展吧,系統已經有這些功能,如sout、notnull等,這個插件在原有的基礎上增添了一些新的功能,我更想做的是通過原作者的代碼自己定製功能,那就更爽了

19.Android Holo Colors Generator
通過自定義Holo主題顏色生成對應的Drawable和布局文件

20.dagger-intellij-plugin
dagger可視化輔助工具

21.
maven gradle 依賴支持自動補全

22.RemoveButterKnife
ButterKnife這個第三方庫每次更新之後,綁定view的註解都會改變,從bind,到inject,再到bindview,搞得很多人都不敢升級,一旦升級,就會有巨量的代碼需要手動修改,非常痛苦
當我們有一些非常棒的代碼需要拿到其他項目使用,但是我們發現,那個項目對第三方庫的使用是有限制的,我們不能使用butterknife,這時候,我們又得從註解改回findviewbyid
針對上面的兩種情況,如果view比較少還好說,如果有幾十個view,那麼我們一個個的手動刪除註解,寫findviewbyid語句,簡直是一場噩夢(別問我為什麼知道這是噩夢)
所以,這種有規律又重復簡單的工作為什麼不能用一個插件來實現呢?於是RemoveButterKnife的想法就出現了。
具體介紹
23.AndroidProguardPlugin
一鍵生成項目混淆代碼插件,值得你安裝~(不過目前可能有些第三方項目的混淆還未添加完全)

24.otto-intellij-plugin
otto事件導航工具。

25.eventbus-intellij-plugin
eventbus導航插件

26.idea-markdown
markdown插件

27.Sexy Editor
設置AS代碼編輯區的背景圖
首先點擊界面的設置按鈕 進入設置界面,選中Plugins,右邊選擇 Browser … ,輸入Sexy … 下面自動彈出候選插件,右邊點擊Install 安裝

安裝成功 後需要重啟AS

重啟完成之後 進入設置界面 選擇other Setting 下的Sexy Editor , 右側 insert 一張或多張圖片即可,上面的其他設置可以設置方位 間隔時間 透明度等等,設置完成後,要關閉打開的文件,重新打開項目文件即可在代碼編輯區顯示插入的圖片,作為代碼編輯區的背景圖。

28.folding-plugin
布局文件分組的插件
29.Android-DPI-Calculator
DPI計算插件

使用:

或者

30.gradle-retrolambda
在java 6 7中使用 lambda表達式插件
修改編譯的jdk為java8:

31.Android Studio Prettify
可以將代碼中的字元串寫在string.xml文件中
選中字元串滑鼠右鍵選擇圖中所示

這個插件還可以自動書寫findViewById

32.Material Theme UI
添加Material主題到你的AS

33..ignore
我 們都知道在Git 中想要過濾掉一些不想提交的文件,可以把相應的文件添加到.gitignore 中,而.gitignore 這個Android Studio 插件根據不同的語言來選擇模板,就不用自己在費事添加一些文件了,而且還有自動補全功能,過濾文件再也不要復制文件名了。我們做項目的時候,並不是所有文 件都是要提交的,比如構建的build 文件夾,本地配置文件,每個Mole 生成的iml 文件,但是我們每次add,commit 都會不小心把它們添加上去,而gitignore 就是解決這種痛點的,如果你不想提交的文件,就可以在創建項目的時候將這個文件中添加即可,將一些通用的東西屏蔽掉。

34.CheckStyle-IDEA
CheckStyle-IDEA 是一個檢查代碼風格的插件,比如像命名約定,Javadoc,類設計等方面進行代碼規范和風格的檢查,你們可以遵從像Google Oracle 的Java 代碼指南 ,當然也可以按照自己的規則來設置配置文件,從而有效約束你自己更好地遵循代碼編寫規范。
35.Markdown Navigator
github:Markdown Navigator
Markdown插件

36.ECTranslation
Android Studio Plugin,Translate English to Chinese. Android Studio 翻譯插件,可以將英文翻譯為中文。

37.PermissionsDispatcher plugin
github:PermissionsDispatcher plugin
自動生成6.0許可權的代碼

38.WakaTime
github:WakaTime
記錄你在IDE上的工作時間

39.AndroidWiFiADB
無線調試應用

40.AndroidLocalizationer
可用於將項目中的 string 資源自動翻譯為其他語言的 Android Studio/IntelliJ IDEA 插件

歡迎關注微信公眾號:終端研發部。和我一塊交流和學習

閱讀全文

與findbugsandroid相關的資料

熱點內容
安卓手機的動態照片為什麼卡 瀏覽:538
ad編譯集成庫時最常見的問題 瀏覽:845
matlab微分方程編程 瀏覽:699
安卓手機如何打開esp文件 瀏覽:545
什麼app能安裝應用 瀏覽:199
手機用什麼app看電視劇電影好 瀏覽:603
導入原理圖為什麼文件夾不顯示 瀏覽:653
androidapp風格 瀏覽:209
php取伺服器url地址 瀏覽:293
linux時間調度演算法 瀏覽:769
單片機最小電路詳解 瀏覽:185
請求要求命令 瀏覽:806
電腦文件夾發微信顯示被佔用 瀏覽:295
手機怎麼看加密視頻 瀏覽:206
怎樣解壓手機es文件包 瀏覽:661
2017年學什麼編程 瀏覽:935
金融期貨pdf 瀏覽:694
程序員客棧的信息保密嗎 瀏覽:507
編程顯示器什麼意思 瀏覽:147
網路編程的就業 瀏覽:260