递归函数中的运行时异常

时间:2014-03-17 21:41:43

标签: java runtime-error

我在我正在处理的函数中遇到运行时异常,但我无法弄清楚原因。该函数需要两个输入String []String。确切的错误是:

  

运行时   例外:java.lang.NullPointerExceptionjava.lang.NullPointerException   在Tourney.winner(Tourney.java:14)参加Tourney.winner(Tourney.java:28)   在Tourney.winner(Tourney.java:28)在Tester $ 1.run(Tester.java:50)

我的代码

public class Tourney {
    public int totalCount = 0;
      public String winner(String[] bracket, String results) {
          if (bracket.length==1){
              return bracket[0];
          }
          else{
              String [] teams = new String [bracket.length/2];
              int count = 0;
              for (int i = 0; i < bracket.length/2; i+=2){
                  if (bracket[i].equals("bye")){
                      teams[count]=bracket[i+1];
                  }
                  else if (bracket[i+1].equals("bye")){//runtime exception is here
                      teams[count]=bracket[i];
                  }
                  else{
                      if(results.charAt(totalCount)=='H'){
                          teams[count]=bracket[i];
                      }
                      else{
                          teams[count]=bracket[i+1];
                      }
                  }
                  count++;
                  totalCount++;
              }
          return (winner(teams,results));
          }
      }
   }

示例输入和结果

  

bracket = {&#34; DUKE&#34;,&#34; UCLA&#34;,&#34; bye&#34;,&#34; MIT&#34;}

     

results =&#34; HL&#34;

     

返回:&#34;麻省理工学院&#34;

2 个答案:

答案 0 :(得分:0)

无法保证:

else if (bracket[i+1].equals("bye"))

ith + 1元素存在。你的函数最终将返回一个大小为1的数组,因此当它尝试访问索引1(第二个元素)的元素时,它将抛出一个NPE。

答案 1 :(得分:0)

如果没有在调试器中单步执行它,我认为你的问题就在这一行:

for (int i = 0; i < bracket.length/2; i+=2)

你的winner()方法是递归调用的,所以如果你从一个带有4个元素的输入数组开始(bracket.length是4),那么winite方法将被递归调用,后面带有2个元素的输入数组从上面引用的for语句开始,遍历for循环。在第二次运行该方法时,以上面列出的for语句开头的循环将执行两次。在循环的第二次,我将是1,这一行:

else if (bracket[i+1].equals("bye")){//runtime exception

将尝试访问不存在的括号[2](递归调用中的bracket.length为2 - 因此只有括号[0]和方括号[1]有效)并且您将获得异常。