2012-01-05 13 views
0

私はcom.android.internal.telephony APIにアクセスするためにアンドロイドで1つのアプリケーションを実行しています。今私はそれらのAPIにアクセスすることができますが、問題は私が自分のクラスでNullPointerExceptionを投げているクラスCall.javaのメソッドgetEarliestConnection()と呼んでいます。 Call.javaはhttp://hi-android.info/src/com/android/internal/telephony/Call.java.htmlとここにあります。このクラスには、次のメソッドがあります。nullポインタ例外をスローする

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 myCall = new MyCall(); 
Connection myConn = new MyConn(); 
myConn = myCall.getEarliestConnection(); 

しかし、それは何のラインでNullPointerExceptionを投げるんだ:上記の方法の10と行何を:上記の3クラスCall.javaは、私がコールクラスのサブクラスを作成していないと、このように、上記の方法を呼ばれる抽象クラスをイアコード。

+0

を忘れてしまったと思います。 – Newts

答えて

1

明らかにgetConnections()はnullを返します。ヌルオブジェクトのサイズを取得することはできません。ここで

はそれを修正する方法は次のとおりです。

だから、
if (l == null || l.size() == 0) 
{ 
    return null; 
} 

、いくつかの未知の理由のために、何も接続-リストまたはリストがない場合は空で、nullが返されます。オペレータ||を使用すると、お使いのセンチ変数がgetConnections()の呼び出し前に初期化されていないされてい

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

あなたは大いに、私はそれを試してみます – shiv1229

+0

素晴らしい答え: – shiv1229

4

おそらくgetConnections()がnullを返すため、lはnullなので、l.size()を呼び出そうとすると例外がスローされます。我々はgetConnections()が何をするのか分からない。これはあまりにも疑わしいこと

注:

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

は、なぜあなたは唯一再びそれを捨てるために、最初の行にMyConnのインスタンスを作成していますか?なぜだけではなく、使用します。一般的には

Connection myConn = myCall.getEarliestConnection(); 

、それはのように遅く、あなたが有益な価値を持っている場合、理想的に、できる限りローカル変数を宣言する価値がある - ので、あなたの方法では、あなたがループ内cを宣言することができ、割り当てt宣言に値があり、割り当ての時点でlが宣言されています。可能であれば、ジェネリックの使用も検討する必要があります。 タイプの代わりにList<MyConn>を使用してください。

EDITは:受け入れ答えとは対照的に、私は接続がない場合は空のリストを返し、常にnull以外の値を返すgetConnections()に変更することをお勧めします。それはより使いやすくなります。

+0

Bcoz Connectionクラスは抽象クラスなので、Connectionクラスのサブクラスを作成しました。 – shiv1229

+0

@ shiv1229:私の答えがあなたのコメントを参照しているか分かりません... –

+0

なぜ、最初の行にMyConnのインスタンスを作成しているのですか?これについて私は – shiv1229

0

あなたの方法

l = getConnections(); 

戻りnull、あなたのライン10は次のようになりますので:if (l==null) {

+0

あなたのためには、私は試してみます – shiv1229

+0

偉大な:)ありがとうalot – shiv1229

0

nullを返しgetConnections()への呼び出しを行うgetEarliestConnection()方法を。

getConnections()Callで抽象であるため、MyCallで指定した方法を確認してください。

2

と同じように行います。したがって、nullで、cm.getActiveFgCall()を呼び出そうとするとNullPointerExceptionが発生します。

+0

@Artm:あなたはそれを初期化しようとしましたが、私はできません。これを初期化する方法。 plzは私を助けます。 – shiv1229

+0

CallManagerは内部クラスですが、どうやってそれに着手する予定ですか? – dten

+0

@WarrenFaith:OPとは何ですか?私は受け取っていない – shiv1229

0

私はリストがnullであるので、あなたが

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

Thx deepak、私はそれを試しましたが、このようなエラーが表示されます: 'コンストラクタCallManager()は表示されません'。私はそれがCallMangerのbcozだと思います.javaはfilal修飾子です。 – shiv1229

+0

いいえ。これは、CallManagerのコンストラクタがpublicでないためです。 最終修飾語は、そのクラスを逆転できないことを意味します。 – Artem

+0

@Artem:これを解決するには? – shiv1229

関連する問題