2012-01-05 236 views
0

我正在做android中的一個應用程序,因爲我需要訪問com.android.internal.telephony API。現在我可以訪問這些API,但是問題出在我稱之爲類Call.java的getEarliestConnection()方法的地方,它拋出了一個NullPointerException。 你可以在這裏找到Call.java http://hi-android.info/src/com/android/internal/telephony/Call.java.html。在這個類中有以下方法:拋出空指針異常

1. public Connection 
2.  getEarliestConnection() { 
3.   List l; 
4.   long time = Long.MAX_VALUE; 
5.   Connection c; 
6.   Connection earliest = null; 
7.  
8.   l = getConnections(); 
9. 
10.   if (l.size() == 0) { 
11.    return null; 
12.   } 

     for (int i = 0, s = l.size() ; i < s ; i++) { 
      c = (Connection) l.get(i); 
      long t; 

      t = c.getCreateTime(); 

      if (t < time) { 
       earliest = c; 
       time = t; 
      } 
     } 

     return earliest; 
    } 

我想在我的班級中調用此方法。類Call.java保險業監督一個抽象類,我創建的調用類的子類,這樣調用上面的方法:

Call myCall = new MyCall(); 
Connection myConn = new MyConn(); 
myConn = myCall.getEarliestConnection(); 

但它的上線投擲NullPointerException沒有:上述方法的10和線路編號:3以上碼。

+0

因爲列表爲空。 – Newts 2012-01-05 10:53:24

回答

1

顯然getConnections()在這裏返回null,你不能得到空對象的大小。

以下是如何解決這個問題:

if (l == null || l.size() == 0) 
{ 
    return null; 
} 

因此,如果由於某種未知的原因,沒有連接的列表或列表爲空,null將被退回。使用操作||會做同樣的

if (l == null) 
{ 
    return null; 
} 
else if (l.size() == 0) 
{ 
    return null; 
} 
+0

非常感謝你,我會嘗試 – shiv1229 2012-01-05 11:04:32

+0

偉大的答案:) – shiv1229 2012-01-05 11:12:04

4

推測getConnections()返回null,所以l爲空,所以試圖撥打l.size()是拋出異常。我們不知道getConnections()做什麼。

注意,這看起來太可疑:

Connection myConn = new MyConn(); 
myConn = myCall.getEarliestConnection(); 

你爲什麼要在第一行創建的MyConn一個實例,只走了一遍扔呢?爲什麼不直接使用:

Connection myConn = myCall.getEarliestConnection(); 

在一般情況下,它的價值聲明局部變量遲,你可以,最好當你有一個有用的價值 - 所以在你的方法,你可以內循環聲明c,分配t聲明中的值,在賦值處聲明l等。您還應該考慮在可能的情況下使用泛型 - 例如List<MyConn>而不僅僅是原始List類型。

編輯:與接受的答案相反,我建議將getConnections()更改爲總是返回非空值,如果沒有連接返回空列表。這將更容易處理。

+0

Bcoz Connection類是一個抽象類,所以我創建了Connection類的子類。 – shiv1229 2012-01-05 10:56:10

+0

@ shiv1229:我不確定你的評論所指的是我的答案中的哪一部分... – 2012-01-05 10:59:27

+0

爲什麼在第一行創建MyConn的實例,只能將其丟棄?爲此我評論 – shiv1229 2012-01-05 11:01:21

0

你方法

l = getConnections(); 

回報null,所以你的10號線應該是這樣的:if (l==null) {

+0

thx for ur rplay。我會嘗試 – shiv1229 2012-01-05 10:57:37

+0

偉大的:)非常感謝 – shiv1229 2012-01-05 11:11:44

0

的方法getEarliestConnection()使得以getConnections()一個調用,它返回null

由於getConnections()Call中是抽象的,請檢查您在MyCall中提供的方法。

2

你釐米變量getConnections()調用之前從未被初始化。所以,它是空的,並且在嘗試調用cm.getActiveFgCall()時會得到NullPointerException。

+0

@Artm:Thx你的答覆。我試圖初始化它,但我不能。如何初始化這個。 PLZ幫助我。 – shiv1229 2012-01-06 10:26:18

+0

CallManager是一個內部類,你打算如何計劃? – dten 2012-01-06 10:27:39

+0

@WarrenFaith:什麼是OP。我沒有收到 – shiv1229 2012-01-06 10:27:58

0

我想你忘記了

CallManager cm;  
cm = new CallManager(); 
+0

Thx deepak,我試過了,但是它顯示的錯誤是這樣的:'構造函數CallManager()不可見'。我認爲它是CallManger.java的bcoz是一個filal修飾符。 – shiv1229 2012-01-06 10:33:37

+0

不是。這是因爲CallManager的構造函數不公開。 最終修飾符表示該類不能被混合。 – Artem 2012-01-06 10:37:00

+0

@Artem:如何解決這個問題? thx for ur replay – shiv1229 2012-01-06 10:44:13