NO IMAGE

一天一個知識點,第二彈! 首先,讓我們來看一道題

下列哪些語句關於記憶體回收的說明是正確的? (b)

A、 程式設計師必須建立一個執行緒來釋放記憶體

B、 記憶體回收程式負責釋放無用記憶體

C、 記憶體回收程式允許程式設計師直接釋放記憶體

D、 記憶體回收程式可以在指定的時間釋放記憶體物件

答案選B,那麼其他答案說的都是什麼呢?讓我們來看一下android開發中的記憶體回收。

以下是一篇關於記憶體回收機制的文章,原文連結http://www.cnblogs.com/bastard/archive/2012/08/17/2644169.html

這篇文章討論比較詳細,內容充實,是從預設回收和核心級別回收兩方面進行分析的。

關於之前的那道題,我們可以看到四個選項,除了B選項之外,其它選項都是說明我們可以主動選擇釋放記憶體,不管是建立執行緒也好,還是呼叫函式也好。然而需要注意,我們是不能夠主動釋放記憶體的。java的GC回收是完全自動的,沒有提供相關api手動回收,所有的記憶體分配和回收許可權都在jvm,不在開發人員手裡。基於這一點,這道題就很明顯選擇B了。

說到了記憶體回收,不得不提到一個詞,記憶體洩漏。那麼記憶體洩漏是什麼呢?簡單的說一下。

同樣,附上一篇網上的文章,關於記憶體洩漏 http://www.cnblogs.com/yejiurui/archive/2013/02/23/2923418.html

記憶體洩漏也稱作“儲存滲漏”,用動態儲存分配函式動態開闢的空間,在使用完畢後未釋放,結果導致一直佔據該記憶體單元。直到程式結束。即所謂記憶體洩漏。

Android應用記憶體洩漏的的原因有以下幾個:

1查詢資料庫後沒有關閉遊標cursor  
2 構造Adapter時,沒有使用 convertView 重用 
3 Bitmap物件不在使用時呼叫recycle()釋放記憶體 
4 物件被生命週期長的物件引用,如activity被靜態集合引用導致activity不能釋放

記憶體洩漏的發現:
通過DDMS中的heap工具,去發現是否有記憶體溢位。

記憶體洩漏如何解決:
通過記憶體分析工具 MAT(Memory Analyzer Tool),找到記憶體洩露的物件

接下來再看一題

下面異常是屬於Runtime Exception 的是(abcd)(多選)
A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException

在開發過程中,我見過的最多的異常就是空指標異常了,那麼其他的三個異常又是什麼呢?

這裡有一篇異常分析的文章,作者看來還是不錯的http://www.open-open.com/lib/view/open1345378428626.html

ArithmeticException(除數為0的異常), BufferOverflowException(緩衝區上溢異常), BufferUnderflowException(緩衝區下溢異常), IndexOutOfBoundsException(出界異常), NullPointerException(空指標異常), EmptyStackException(空棧異常), IllegalArgumentException(不合法的引數異常), NegativeArraySizeException(建立一個大小為負數的陣列錯誤異常),
NoSuchElementException, SecurityException(安全異常), SystemException, UndeclaredThrowableException

1. java.lang.NullPointerException
  異常的解釋是”程式遇上了空指標”,簡單地說就是呼叫了未經初始化的物件或者是不存在的物件,即把陣列的初始化和陣列元素的初始化混淆起來了。陣列的初始化是對陣列分配需要的空間,而初始化後的陣列,其中的元素並沒有例項化,依然是空的,所以還需要對每個元素都進行初始化(如果要呼叫的話)
2. java.lang.ClassNotFoundException  

異常的解釋是”指定的類不存在”。
3. java.lang.ArithmeticException  

這個異常的解釋是”數學運算異常”,比如程式中出現了除以零這樣的運算就會出這樣的異常。
4. java.lang.ArrayIndexOutOfBoundsException
  異常的解釋是”陣列下標越界”,現在程式中大多都有對陣列的操作,因此在呼叫陣列的時候一定要認真檢查,看自己呼叫的下標是不是超出了陣列的範圍,一般來說,顯示(即直接用常數當下標)呼叫不太容易出這樣的錯,但隱式(即用變數表示下標)呼叫就經常出錯了,還有一種情況,是程式中定義的陣列的長度是通過某些特定方法決定的,不是事先宣告的,這個時候,最好先檢視一下陣列的length,以免出現這個異常。
5. java.lang.IllegalArgumentException
  這個異常的解釋是”方法的引數錯誤”,比如g.setColor(int red,int green,int blue)這個方法中的三個值,如果有超過255的也會出現這個異常,因此一旦發現這個異常,我們要做的,就是趕緊去檢查一下方法呼叫中的引數傳遞是不是出現了錯誤。
6. java.lang.IllegalAccessException
  這個異常的解釋是”沒有訪問許可權”,當應用程式要呼叫一個類,但當前的方法即沒有對該類的訪問許可權便會出現這個異常。對程式中用了Package的情況下要注意這個異常

附上文章連結http://blog.csdn.net/jaycee110905/article/details/45154039

一般面試中java Exception(RuntimeException )是必會被問到的問題
常見的異常列出四五種,是基本要求。更多的。。。。需要注意積累了
 
常見的幾種如下:
 
1、NullPointerException – 空指標引用異常
2、ClassCastException – 型別強制轉換異常。
3、IllegalArgumentException – 傳遞非法引數異常。
4、ArithmeticException – 算術運算異常
5、ArrayStoreException – 向陣列中存放與宣告型別不相容物件異常
6、IndexOutOfBoundsException – 下標越界異常
7、NegativeArraySizeException – 建立一個大小為負數的陣列錯誤異常
8、NumberFormatException – 數字格式異常
9、SecurityException – 安全異常
10、UnsupportedOperationException – 不支援的操作異常

第二彈就先寫到這裡,主要是針對Android面試中常遇到的一些問題,有些知識點是需要大量的時間和實踐才能理解的,不是一天能夠看完的。那些內容,還需要我們抽出時間來慢慢補足。