2012-03-20 91 views
1

我想在堆栈上进行push和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

请张贴例外本身,让我们知道哪些线把它扔。 – paislee 2012-03-20 18:29:58

+0

bf.readLine也可能返回null – assylias 2012-03-20 18:39:39

回答

2

stack_pop方法,你试图影响价值为空数组:

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

你应该包含在你的栈元素的数量进行初始化。

有在此方法中的其他问题也一样:

for (int i = 1; i < n; i++) 

其中n在开始时定义为0,从来没有改变过。

你为什么要打两次stack_pop(st)?第二次调用将始终使用空的堆栈。如果是测试如果异常被捕获,该行

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

使你的程序崩溃为您试图访问pop_array[0],而您初始化堆栈的大小你的阵列,这是0

0

在下面的代码中,您将pop_array设置为null,然后尝试使用它。这是你的问题。

 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()]; 

你也可能需要在你的系统输出保护:

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

pop_array是不初始在编,

final int [] pop_array = null; 

变化成,

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