2017-07-22 3 views
1

Ich habe versucht, Eingaben aus einer Datei zu lesen und ihre Zeichen zu klassifizieren. Drucken, wie viele Zeichen Großbuchstaben, Kleinbuchstaben, Ziffern, Leerraum und etwas anderes in der Textdatei sind. Also habe ich an meinem Code gearbeitet, aber ich hatte zwei Probleme.Wann sollten Sie einen Scanner schließen?

Wenn ich versuche, meinen Scanner zu schließen, stoße ich auf eine java.lang.IllegalStateException: Scanner geschlossen. Außerdem produziert mein Code eine Endlosschleife, aber ich habe es stundenlang angeschaut, aber ich weiß nicht, was los ist. Ich bin ein Anfänger bei Java, also habe ich noch nichts über hashmap oder gepufferte Leser erfahren. Danke für all deine Hilfe.

Hier ist mein Code:

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(); 

    } 


    } 
} 
+0

Angenommen, Sie verschieben die 'in.close()' out Seite der 'while' Schleife. –

Antwort

3

Sie sollten den Scanner aus der while-Schleife schließen, indem Sie versuchen, mit resources.

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

    } 
} 
+0

Sind Try-mit-Ressourcen Dinge wie BufferedReader? – Vickie

+0

Ja. 'Scanner' wird geschlossen, indem versucht wird, 'Closeable' zu implementieren. –

1

Sie sollten den Scanner schließen, nachdem Sie es getan verwenden. Dieses Beispiel schließt Sie am Ende der Schleife, also versucht es, im while-Zustand nach mehr Daten zu suchen und schlägt fehl.

Versuchen Sie, das Schließen zu verschieben, bis die While-Schleife beendet ist.

+0

Ich habe versucht, den Scanner außerhalb der While-Schleife zu schließen, aber dann bekomme ich eine Endlosschleife. – Vickie

1

Es sieht so aus, als würden Sie den Scanner in Ihrer während Schleife schließen. Sie müssen es außerhalb der Schleife schließen. Sie erhalten die Ausnahme, weil der Scanner nach der ersten Schleifeniteration geschlossen ist.

Verwandte Themen