【问题标题】:Exception in Thread Main. NullPointException主线程异常。空指针异常
【发布时间】:2012-03-20 18:27:23
【问题描述】:

我正在尝试对堆栈执行推送和弹出操作,并尝试从堆栈中弹出最小元素。它显示空指针异常。我尝试调试它。但它仍然抛出空点异常。

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"); 
        }
    }
}

【问题讨论】:

  • 请发布异常本身,以便我们知道是哪一行抛出它。
  • bf.readLine 也可能返回 null

标签: java nullpointerexception


【解决方案1】:

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。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你没有初始化你的 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]);
      }
      

      【讨论】:

        【解决方案4】:

        pop_array 未初始化,

        final int [] pop_array = null;
        

        改成,

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

        【讨论】:

          猜你喜欢
          • 2013-12-19
          • 1970-01-01
          • 1970-01-01
          • 2015-09-03
          • 1970-01-01
          • 2015-07-12
          相关资源
          最近更新 更多