糾正編碼錯誤篇 (3)Cursor、Exception 常見警告及解決辦法

前言#

這一篇接著講講一些比較有意思的黃色警告(Warning),仔細(xì)的想了一下,也就想起來了cursor,Exception是最近才遇到的,所以也順便說一下。

對于系統(tǒng)的一般的警告提示,比如,局部變量不要賦值啊 ,if條件恒等啊,方法已經(jīng)過時之類的,這里就不說了。

正文#

<h2>Cursor</h2>

Cursor是光標(biāo)的意思,主要就是應(yīng)用在數(shù)據(jù)庫中,我們?nèi)ゲ樵円粭l或多條記錄,會返回查詢結(jié)果的光標(biāo),通過對這個光標(biāo)進(jìn)行循環(huán),得到所有的查詢結(jié)果。

我遇到的Cursor主要有兩個非常重要的警告(Warning):

1、可能出現(xiàn)空指針異常的警告

Method invocation 'moveToNext' may produce 'java.lang.NullPointerException' less...
This inspection analyzes method control and data flow to report possible conditions that are always true or false, expressions whose value is statically proven to be constant, and situations that can lead to nullability contract violations.
Variables, method parameters and return values marked as @Nullable or @NotNull are treated as nullable (or not-null, respectively) and used during the analysis to check nullability contracts, e.g. report NullPointerException (NPE) errors that might be produced.

好長的英文,雖然我能看懂,但是組織語言就有點(diǎn)費(fèi)勁了,大概的意思就是在某些情況下,返回的Cursor可能是空的,建議我們用一些 @Nullable 或者 @NotNull 注解來檢查是否可以為空,也就是這里可能為空,你看著辦吧。

當(dāng)時我們不能這么任性,都空指針了肯定是要崩潰的,為了增強(qiáng)程序的健壯性,在外層加上if(cursor != null) 就OK了。

2、Cursor沒有被回收

This Cursor should be freed up after use with #close() less... (?F1)
Many resources, such as TypedArrays, VelocityTrackers, etc., should be recycled (with a recycle() call) after use. This lint check looks for missing recycle() calls

大概意思就是,這個Curor應(yīng)該在使用之后調(diào)用close()方法釋放自己。許多資源,比如TypeArrays,VelocityTrackers 等等,他們使用結(jié)束了之后了需要調(diào)用recycle()來回收和釋放。

當(dāng)我們一開始接觸Cursor和數(shù)據(jù)庫的時候,都聽過看過無數(shù)次Cursor必須要close(),再犯這個錯誤就有點(diǎn)尷尬了,如果是try-catch中,建議把Cursor的回收放在finally中。

例如:

        Cursor cursor = null;
        try {
            StringBuilder sql = new StringBuilder("select * from Student");
            cursor = SqlUtil.getInstance().rawQuery(sql.toString(), null);
            if (cursor != null) {
                while (cursor.moveToNext()) {
                ...
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if (cursor != null) {
                cursor.close();
            }
        }

<h2>Exception</h2>

Exception就是異常,也是我們最不愿意看到的東西,因?yàn)樗拇嬖?,不得不做很多意外的處理,否則程序就會變得不穩(wěn)定。

我遇到的情況,不能算是一個問題,僅僅是一種建議,但是我覺得很有意義,所以貼了出來:

catch' branch identical to 'InstantiationException | IllegalAccessException' branch less... (?F1)
Reports identical catch sections in try blocks under JDK 7. A quickfix is available to collapse the sections into a multi-catch section.
This inspection only reports if the project or module is configured to use a language level of 7.0 or higher.

上面的警告大概意思是:在 try的代碼塊中,相同的catch塊結(jié)構(gòu)在JDK 7 以下比把這些塊進(jìn)行折疊到一個(<b>多catch塊</b>)中要更有效。這個檢查只在project或者module被配置使用JDK 7 或者更高的時候報告。

上面的 <b>多catch塊</b> 被我加粗了,括號是為了方便斷句。直接看我的截圖,所有的東西就都明白了:

之前的catch語句


這里寫圖片描述

修改完的catch 語句:

這里寫圖片描述

一目了然,就是通過 “|” 運(yùn)算符號折疊成一個判斷語句,這個符號有"或"的意思,我覺得在這里理解非常合適。

應(yīng)該是java意識到了catch語句的臃腫,所以在JDK中開始建議這種模式來捕獲異常,相信將來,java其他方面也會越來越簡化。

總結(jié)#

從這些小小的警告中,我可以感受到編輯器默默無聞的為我們做了很多的事情,這也是為什么換了編輯器,很多人都會突然懵逼,所以看到這些提示,我們應(yīng)該把正確的編碼格式變?yōu)樽约旱牧?xí)慣,把之前自己的陋習(xí)和缺點(diǎn)慢慢改正,而不是視而不見,一下帶過。

暫時想不起來還有什么比較有意思的警告,如果有我再補(bǔ)上,如果有問題或者我說的有問題的地方歡迎留言指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 技術(shù)無極限,從菜鳥開始,從源碼開始。 由于公司目前項(xiàng)目還是用OC寫的項(xiàng)目,沒有升級swift 所以暫時SDWebI...
    充滿活力的早晨閱讀 12,839評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,673評論 18 399
  • 轉(zhuǎn)載,覺得這篇寫 SQLAlchemy Core,寫得非常不錯。不過后續(xù)他沒寫SQLAlchemy ORM... ...
    非夢nj閱讀 5,602評論 1 14
  • 所有的編譯警告的名稱:參見網(wǎng)址:http://fuckingclangwarnings.com注意這篇文章的創(chuàng)建時...
    zhangyin閱讀 11,184評論 0 53
  • 昨夜讀《中庸》第十五章上篇,孔子感嘆鬼神功德的力量。問題是,孔子信鬼神嗎? 現(xiàn)存孔子著作主要是一部《論語》,其中出...
    任艾軍閱讀 327評論 0 1

友情鏈接更多精彩內(nèi)容