Java Scanner.next()或方法调用

时间:2013-12-28 20:10:58

标签: java

我正在编写一个程序,它接受一个输入并搜索一个单词列表中的任何一个字谜。为此,它调用一个void方法search来打印10个字谜。以下是导致我麻烦的代码段:

public static void main(String[] args) throws Exception
   {
      Scanner input = new Scanner(System.in);
      System.out.println("Please enter a word: ");
      String word = input.next();
      System.out.println(word);
      search(word);
   } 

这总是打印出你输入的任何单词,但随后它就会停止。当我在jGRASP中使用调试器时,我注意到它甚至没有为word保存任何值!它也从不调用search类。代码冻结 - 它说它仍然在运行,但它没有做任何事情。但是,如果我让用户在单词后输入一个整数值,如下所示:

Scanner input = new Scanner(System.in);
System.out.println("Please enter a word: ");
String word = input.next();
System.out.println(word);
System.out.println("Enter a number: ");
int example = input.nextInt();
search(word);

这会将值保存到word,但不会保存example,并且代码会像以前一样冻结!

编辑:这是search方法。 words.txt是同一文件夹中的单词列表。

public static void search(String input) throws Exception
   {
      Scanner words = new Scanner(new File("words.txt"));
      char[] alphabet = new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
      int[] inputLetters = new int[25];
      int[] wordLetters = new int[25];
      String[] anagrams = new String[10];
      int entries = 0;
      for(int a = 0; a < input.length(); a++)
      {
         for(int b = 0; b <= 25; b++)
         {
            if(input.charAt(a) == alphabet[b])
            {
               inputLetters[b]++;
            }
         }
      }
      while(entries < anagrams.length)
      {
         while(words.hasNext())
         {
            String comparison = words.next();
            for(int a = 0; a < comparison.length(); a++)
            {
               for(int b = 0; b < 25; b++)
               {
                  if(comparison.charAt(a) == alphabet[b])
                  {
                     wordLetters[b]++;
                  }
               }
            }
            if(inputLetters == wordLetters)
            {
               anagrams[entries] = comparison;
               entries++;
            }
         }
      }
     System.out.println(Arrays.toString(anagrams));
   }

1 个答案:

答案 0 :(得分:2)

实际上,这一天很明显。您不需要调试器来查找无限循环。

以下是代码的关键部分:

  int[] inputLetters = new int[25];
  int[] wordLetters = new int[25];

  while(entries < anagrams.length)
  {
        ....

        if(inputLetters == wordLetters)
        {
           ......
           entries++;
        }
     }
  }

分析:

  1. 只要entries(最初为0)小于anagrams.length,就会循环播放;
  2. 如果entries;
  3. ,您会增加inputLetters == wordLetters
  4. 但很明显,inputLetters引用永远不能等于wordLetters引用。每个都引用自己的数组;
  5. 因此您无法增加entries;
  6. 因此你有一个无限循环。