java的EmptyStackException

时间:2014-06-02 05:06:07

标签: java

,而我正在运行以下源代码

import java.util.Stack;
public class Assignment3 {

boolean conflict, complete = false;

public static int solve(int n) {

    int solution = 0;
    int nextQueen = 0;
    boolean problem = false;
    s.push(0);
    do{
      for(int i = 0; i < s.size(); i++)
      {
        if(s.get(i) == nextQueen){ 
          problem = true;
          break;
        }
        else if(s.get(i) - i == nextQueen - s.size()){
          problem = true;
          break;
        }
        else if(s.get(i) + i == nextQueen + s.size()){
          problem = true;
          break;
        }
      }
      if(problem = false){
        s.push(nextQueen);
        nextQueen = 0;}
      else{
        nextQueen++;
      }
      if(nextQueen == n){
        if(s.peek() == n){
          s.pop(); 
          nextQueen = s.pop()+ 1; 
        }
        else{
          nextQueen = s.pop()+ 1;
        }
      }
      }while(s.size() != n);

      printSolution(s);
      solution++;
      return solution;
      }


    private static void printSolution(Stack<Integer> s) {
      for (int i = 0; i < s.size(); i ++) {
        for (int j = 0; j < s.size(); j ++) {
          if (j == s.get(i))
            System.out.print("Q ");
          else
            System.out.print("* ");
        }
        System.out.println();
      }
      System.out.println();  
    }

    // ----- the main method -----
    // (you shouldn't need to change this method)
    public static void main(String[] args) {

      int n = 8;

      // pass in parameter n from command line
      if (args.length == 1) {
        n = Integer.parseInt(args[0].trim());
        if (n < 1) {
          System.out.println("Incorrect parameter");
          System.exit(-1);
        }//if   
      }//if

      int number = solve(n);
      System.out.println("There are " + number + " solutions to the " + n + "-queens problem.");
    }
}

获得以下错误。帮我澄清一下:

Exception in thread "main" java.util.EmptyStackException
        at java.util.Stack.peek(Stack.java:79)
        at Assignment3.solve(Assignment3.java:40)
        at Assignment3.main(Assignment3.java:87)

2 个答案:

答案 0 :(得分:2)

根据API文档,如果堆栈为空,peek()方法将抛出EmptyStackException

在从中查看值之前,您必须检查堆栈是否为空。有一个empty()方法返回一个布尔值取决于堆栈

  

移除此堆栈顶部的对象并将该对象返回为   这个函数的价值。

     

<强>返回:

     

此堆栈顶部的对象(Vector的最后一项   对象)。

     

<强>抛出:

     

EmptyStackException - 如果此堆栈为空。

答案 1 :(得分:0)

一个可能的原因可能是if条件有if(problem = false){(实际应该是problem==false或更好!problem)。语句problem = false的输出将始终为false,因此条件每次都会失败,并且Stack没有添加任何内容(开头的s.push(0)除外)。现在,您尝试从peek()中提取(Stack)某些内容,Stack为空,这样您就会获得异常。最佳做法是在从中拉出物品之前始终检查堆栈是否为空。您可以使用Stack.isEmpty()来实现此目的。我没有测试过,但problem = false肯定是错误的。