2012-02-27 14 views
1

私はjavaを使い慣れていないので、基本的にユーザーの入力を求めて平均を返す単純なプログラムを作成しようとしています。追加しようとすると、私はjava.lang.NullPointerExceptionを得続けます。どうしてこれなの?これはこれまでのコードです。2つの数字を追加するときにnullPointerExceptionが発生する

import java.io.*; 
class Numbers { 
    public static void main(String[] args) { 
      System.out.println("Hello USER! This is TRON, state the number of NUMBERS you wish to enter and I will return the Average..."); // Display the string. 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      Integer loopnum = null; 
      Integer i = null; 
      Long num = null; 
      Long sum = null; 
      Long avg = null; 

      try { 
       loopnum = Integer.parseInt(br.readLine()); 

      } 
      catch(IOException e){ 
       System.out.println("Error!"); 
       System.exit(1); 
      } 
      System.out.println("OK now enter your numbers."); 
      for (i=1;i<=loopnum; i++) { 
       try { 
       System.out.println("Enter number "+i+":"); 
       num = Long.parseLong(br.readLine()); 
       sum += num; 
       } 
       catch(IOException e){ 
        System.out.println("Error!"); 
        System.exit(1); 
       } 
      } 

       avg = sum/loopnum; 
       System.out.println("TRON here, Your average is: " + avg); 




    } 
} 

答えて

1

初期化!コードの先頭で宣言をLong sum = 0Lに変更します。この行は、あなたのループに問題がある:

sum += num; 

sum = sum + num;評価が右から左に行われ、あなたはそれがnull変数sumの変数numを追加しようと見るように、それは同じです。

+0

プリミティブを長く使用する方がさらに優れています。また、右から左への評価でもNPEが発生します。 – Thilo

+0

nullにsumを加算しようとしていないので、null参照でlongValueを呼び出しています。 –

1

Long変数を0Lに初期化する必要があります。nullではありません。さらに、Integerではなく、ラッパータイプLongintの代わりにプリミティブタイプlongを使用すると、ここでラッパーオブジェクトを使用する必要はありません。

int loopnum = 0; 
int i = 0; 
long num = 0L; 
long sum = 0L; 
long avg = 0L; 

上記NullPointerExceptionを取り除くだろうとプリミティブとオブジェクトのデータ型の間の値の不要なボクシング/アンボクシングを避けることができます:これを行います。

+1

downvoter、理由を説明するために気をつけてください? –

-2

null以外の値でsum変数を初期化します。おそらく0L。

この行を置き換えますsum += numsum = sum + num ..これは読みやすくなります。

1

他の回答は、なぜNULLポインタ例外が発生しているのかについては言及していません。 longプリミティブの代わりにLongオブジェクトを使用しています。したがって、直接算術演算(+など)を使用するときはいつでも、コンパイラはLong.longValue()を呼び出してlongLongを展開します。だから、sum += sumはに翻訳さ:sumので

sum = Long.valueOf(sum.longValue() + sum.longValue()); 

あなたがnullポインタ例外になってしまいますnullです。ほとんどの人はプリミティブlongを使うだけでこれを回避します。

関連する問題