2012-03-20 2 views
1

私はスタック上でプッシュ&ポップ操作を行い、スタックから最小要素をポップしようとしています。ヌルポインタ例外を示しています。私はそれをデバッグしようとしました。しかし、まだそれはヌルポイント例外をスローしています。 stack_pop方法でスレッドメインでの例外。 NullPointException

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.*; 
public class Stacks { 
     static void Stack_Push(Stack<Integer> SP, int a) 
     { 
      SP.push(new Integer(a)); 
      System.out.println("stack: " + SP); 
     } 

     static void stack_pop(Stack<Integer> SP) { 
      System.out.print("Popping Minimum Element "); 
      int n = 0, k = 0; 
      final int [] pop_array = null; 
      while (!SP.empty()){ 
       int pop_elem = SP.pop(); 
       pop_array[k++] = pop_elem; 
      } 

      for (int i = 1; i < n; i++) { 
       int j = i; 
       int B = pop_array[i]; 
       while ((j > 0) && (pop_array[j-1] > B)) { 
        pop_array[j] = pop_array[j-1]; 
        j--; 
       } 
       pop_array[j] = B; 
      } 
      System.out.println("stack: " + pop_array[0]); 
    } 

    public static void main(String args[]) throws IOException { 
     Stack<Integer> st = new Stack<Integer>(); 
     int num, n; 
     InputStreamReader ir = new InputStreamReader(System.in); 
     BufferedReader bf = new BufferedReader(ir); 
     System.out.print("Enter number of elements : "); 
     String str = bf.readLine(); 
     num = Integer.parseInt(str); 
     for(int i = 0; i < num; i++){ 
       System.out.print("Enter elements : "); 
      str = bf.readLine(); 
      n = Integer.parseInt(str); 
      Stack_Push(st, n); 
     } 

     stack_pop(st); 
     try { 
      stack_pop(st); 
     } 
      catch (EmptyStackException e) { 
      System.out.println("empty stack"); 
     } 
    } 
} 
+2

final int [] pop_array = null; 

に変更して、で、例外自体を投稿してください。 – paislee

+0

bf.readLineもnullを返す可能性があります。 – assylias

答えて

2

、あなたはヌル配列に値に影響を与えるためにしようとしている:

final int [] pop_array = null; 
... 
pop_array[k++] = pop_elem; 

あなたのスタックに含まれる要素の数でそれを初期化する必要があります。

は次のように、あまりにもこの方法では他の問題があります。

nが先頭で0に定義されており、変更されることはありません
for (int i = 1; i < n; i++) 

なぜ2回電話していますかstack_pop(st)? 2番目の呼び出しは常に空のスタックで行われます。それは例外がキャッチされている場合、ラインを試験することであった場合は、0

0

たスタックのサイズを使用して配列を初期化に対し、あなたはpop_array[0]にアクセスしようとして

System.out.println("stack: " + pop_array[0]); 

は、あなたのプログラムがクラッシュします下のコードでは、pop_arraynullに設定し、それを処理しようとしています。これがあなたの問題です。

 final int [] pop_array = null; 
     while (!SP.empty()){ 
      int pop_elem = SP.pop(); 
      pop_array[k++] = pop_elem; 
     } 
0

あなたのpop_arrayを初期化しませんでした:

final int [] pop_array = null; 

はこれを試してみてください:

final int [] pop_array = new int[SP.size()]; 

また、あなたがあなたのSYSOUT周りのガードが必要になる場合があります。

if (pop_array.length > 0) { 
    System.out.println("stack: " + pop_array[0]); 
} 
0

pop_arrayですinitializeではない我々はそれを投げされているラインを知っているように、エドは

final int [] pop_array = new int [SP.size()]; 
関連する問題