2016-08-06 69 views
1

Ich habe eine einfache "Hausaufgaben" zu tun, aber ich habe ein kleines Problem mit dem Schließen des Eingabestroms gefunden. Um es einfach auszudrücken, muss ich eine Kontakt "List" -Anwendung in Java machen, nur um den Polymorphismus in der richtigen Weise zu verwenden. Also habe ich eine Klasse Kontakt und eine Unterklasse Privat (Kontakt). In beiden Klassen gibt es eine Änderungsmethode, um den Wert der Variablen zu ändern.Stream geschlossen und nicht wieder geöffnet - Java

public void modify() throws IOException { 
    System.out.println("Previously name: " + name); 
    System.out.println("Insert new name"); 
    try(InputStreamReader ir = new InputStreamReader(System.in);  
    BufferedReader in = new BufferedReader(ir)) { 
     name= in.readLine(); 
     System.out.println("You've changed the name to: "+ name);      
    System.out.println("Previously surname: " + surname); 
    System.out.println("Insert new surname"); 
     surname= in.readLine(); 
     System.out.println("You've changed the surname to: "+ surname);       
    System.out.println("Previously e-mail: " + email); 
    System.out.println("Insert new e-mail"); 
     email = in.readLine(); 
     System.out.println("You've changed the e-mail to: "+ email); }     
} 

Dies ist die Kontaktmethode, die nicht Problem

@Override 
public void modify() throws IOException { 
    super.modifica(); 
    System.out.println("Numero di cellulare precedente: " + cell); 
    System.out.println("Inserire nuovo numero"); 
    try (InputStreamReader ir = new InputStreamReader(System.in); 
    BufferedReader in = new BufferedReader(ir)) { 
     cell = in.readLine(); 
     System.out.println("Hai cambiato il numero in: "+ cell);       
    System.out.println("Contatto skype precedente: " + skype); 
    System.out.println("Inserire nuovo contatto"); 
     skype = in.readLine(); 
     System.out.println("Hai cambiato il contatto in: "+ skype);       
} 
} 

Statt in Privat, ist dies die Überschreibung der Methode nicht erstellen. In der Hauptsache erstelle ich ein Private-Objekt und rufe die Modify-Methode auf. Ich kann Name, Nachname und E-Mail ohne Probleme einfügen, dann löst die Methode eine E/A-Ausnahme aus, weil der Stream geschlossen ist. Ich kann nicht verstehen, warum ich diese Art von Problem habe. Ich denke, dass der Stream durch den Versuch mit Ressourcen im ersten Code geschlossen wird, aber dann im zweiten Code von einem anderen Versuch mit Ressourcen geöffnet wird. Wahrscheinlich stimmt etwas in meiner Idee nicht.

+0

Vielleicht sollten Sie 'java.util.Scanner' lernen. Sie könnten hier beginnen: http://stackoverflow.com/a/11871792/4791599 –

+0

Vielen Dank! Gibt es Unterschiede in Bezug auf die Möglichkeiten und die Speicherverwaltung zwischen Scanner und BufferedReader? – Bondye

+0

Mögliches Duplikat von [Closing BufferedReader und System.in] (http://stackoverflow.com/questions/8203981/closing-bufferedreader-and-system-in) –

Antwort

0

Ihr Problem ist in der Tat aufgrund der Try-with-Ressource-Anweisung, die new InputStreamReader(System.in) schließt, die hinter der Szene auch den darunter liegenden Eingangsstrom schließt die System.in ist (in ist ein public static Feld System), so dass in Ihrer modify Methode System.in ist schon geschlossen und kann dann nicht mehr gelesen werden, deshalb bekommst du diese Ausnahme.

+0

... und der Stream 'System.in' kann nicht * sein wiedereröffnet * von einer Anwendung. –

+0

Muss ich versuchen versuchen? Da ich in einem Buch lese, ist es wichtig, den Stream so schnell wie möglich zu schließen und der Autor schlägt vor, es mit der Ressource zu versuchen. – Bondye

+0

Die Verwendung von try-with-resources-Anweisung ist in der Tat eine gute Übung, aber nicht hier, da die einzige resouce, die Sie wirklich schließen, nicht geschlossen werden sollte, so dass Sie es hier nicht verwenden können –

0

Sie könnten immer noch try-with-resources verwenden, wenn Sie System.in mit einem CloseShieldInputStream umhüllen.

Ich würde auch mit einem Scanner anstatt die InputStreamReader und BufferedReader, empfehlen wegen seiner Einfachheit ist:

import java.util.Scanner; 
import org.apache.commons.io.input.CloseShieldInputStream; 

public class Contact { 

    protected String name; 
    protected String surname; 
    protected String email; 

    public void modify() throws IOException { 
     System.out.println("Previously name: " + name); 
     System.out.println("Insert new name"); 
     try (Scanner sc = new Scanner(new CloseShieldInputStream(System.in))) { 
      name = sc.nextLine(); 
      System.out.println("You've changed the name to: " + name); 
      System.out.println("Previously surname: " + surname); 
      System.out.println("Insert new surname"); 
      surname = sc.nextLine(); 
      System.out.println("You've changed the surname to: " + surname); 
      System.out.println("Previously e-mail: " + email); 
      System.out.println("Insert new e-mail"); 
      email = sc.nextLine(); 
      System.out.println("You've changed the e-mail to: " + email); 
     } 
    } 
} 

public class Private extends Contact { 

    private String cell; 
    private String skype; 

    @Override 
    public void modify() throws IOException { 
     super.modify(); 
     System.out.println("Numero di cellulare precedente: " + cell); 
     System.out.println("Inserire nuovo numero"); 
     try (Scanner sc = new Scanner(new CloseShieldInputStream(System.in))) { 
      cell = sc.nextLine(); 
      System.out.println("Hai cambiato il numero in: " + cell); 
      System.out.println("Contatto skype precedente: " + skype); 
      System.out.println("Inserire nuovo contatto"); 
      skype = sc.nextLine(); 
      System.out.println("Hai cambiato il contatto in: " + skype); 
     } 
    } 
} 

Siehe auch: Closing BufferedReader and System.in