你什么时候关闭扫描仪?

时间:2017-07-22 02:21:04

标签: java string character java.util.scanner

我一直试图从文件中读取输入并对其字符进行分类。在文本文件中打印多少个字符是大写字母,小写字母,数字,空格和其他内容。所以我一直在处理我的代码,但我遇到了两个问题。

当我尝试关闭扫描程序时,遇到java.lang.IllegalStateException:扫描程序已关闭。此外,我的代码产生了无限循环,但我已经看了几个小时,但我不知道什么是错的。我是Java的初学者,所以我还没有学习过hashmap或Buffered Readers。谢谢你的帮助。

这是我的代码:

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Characters
{
   public static void main(String[] args) throws FileNotFoundException
   {
      Scanner console = new Scanner(System.in);
      System.out.print("Input file: ");
      String inputFileName = console.next();
      Scanner in = new Scanner(new File(inputFileName)); 

      while(in.hasNextLine())
      {
          String line = in.nextLine(); 
          int len = line.length(); 
          int uppercase = 0 ;
          int lowercase = 0;
          int digits = 0;
          int whitespace = 0; 
          int other = 0; 

          for ( int i = 0 ; i < len ; i++)
          {
              char c = line.charAt(i); 

          if (Character.isLowerCase(c))
          {
              lowercase++; 
          }
          else if (Character.isUpperCase(c))
          {
              uppercase++;
          }
          else if (Character.isDigit(c))
          {
              digits++; 
          }
          else if (Character.isWhitespace(c))
          {
              whitespace++;
          }
          else
              other++;
          }

      System.out.println("Uppercase: " + uppercase);
      System.out.println("Lowercase: " + lowercase);
      System.out.println("Digits: " + digits);
      System.out.println("Whitespace: " + whitespace);
      System.out.println("Other: " + other);
      in.close();

   }


   }
}

3 个答案:

答案 0 :(得分:3)

您应该使用try-with-resouces从while循环中关闭扫描仪。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Characters {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner console = new Scanner(System.in);
        System.out.print("Input file: ");
        String inputFileName = console.next();
        try (Scanner in = new Scanner(new File(inputFileName))) {
            while (in.hasNextLine()) {
                String line = in.nextLine();
                int len = line.length();
                int uppercase = 0;
                int lowercase = 0;
                int digits = 0;
                int whitespace = 0;
                int other = 0;

                for (int i = 0; i < len; i++) {
                    char c = line.charAt(i);

                    if (Character.isLowerCase(c)) {
                        lowercase++;
                    } else if (Character.isUpperCase(c)) {
                        uppercase++;
                    } else if (Character.isDigit(c)) {
                        digits++;
                    } else if (Character.isWhitespace(c)) {
                        whitespace++;
                    } else
                        other++;
                }

                System.out.println("Uppercase: " + uppercase);
                System.out.println("Lowercase: " + lowercase);
                System.out.println("Digits: " + digits);
                System.out.println("Whitespace: " + whitespace);
                System.out.println("Other: " + other);
            }
        }

    }
}

答案 1 :(得分:1)

使用完毕后应关闭扫描仪。该示例让您在循环结束时关闭,因此它会尝试在while条件中检查更多数据并失败。

尝试移动关闭,直到while循环退出。

答案 2 :(得分:1)

您似乎正在 while 循环中关闭扫描仪。你必须在循环外关闭它。您得到异常,因为在第一次循环迭代后,扫描仪关闭。