2016-08-06 3 views
1

У меня есть простая домашняя работа, но я нашел небольшую проблему с закрытием входного потока. Проще говоря, я должен создать приложение «список» в Java, чтобы правильно использовать полиморфизм. Поэтому у меня есть контакт класса и подкласс Private (контакт). В обоих классах существует способ изменения значения переменных.Поток закрыт и не открыт повторно - 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); }     
} 

Это Контактная метод, который не создает проблем

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

Вместо этого переопределение метода в частном порядке. В основном я создаю объект Private, и я вызываю метод изменения. Я могу вставить имя, фамилию и электронную почту без проблем, тогда метод выдает исключение IO, потому что поток закрыт. Я не могу понять, почему у меня такая проблема. Я думаю, что поток закрыт попыткой с ресурсами в первом коде, но затем он открывается во втором коде другой попыткой с ресурсами. Возможно, что-то в моей идее ошибочно.

+0

Может быть, вы должны узнать о 'java.util.Scanner'. Вы можете начать здесь: http://stackoverflow.com/a/11871792/4791599 –

+0

Спасибо! Существуют ли различия в возможностях и управлении памятью между сканером и BufferedReader? – Bondye

+0

Возможный дубликат [Closing BufferedReader и System.in] (http://stackoverflow.com/questions/8203981/closing-bufferedreader-and-system-in) –

ответ

0

Ваша проблема действительно в связи с утверждением примерочного с-ресурсом, который замыкает new InputStreamReader(System.in), который за сценой замыкает также поток основного входа, который System.in (in является public static поля System) таким образом, что в методе modifySystem.in является уже закрыты и затем не могут быть прочитаны больше, поэтому вы получаете это исключение.

+0

... и поток 'System.in' не может быть * открыта * приложением. –

+0

Нужно ли удалить попытку? Поскольку я читал в книге, важно как можно скорее закрыть поток, и автор предлагает использовать попытку с ресурсом, чтобы сделать это. – Bondye

+0

, используя инструкцию try-with-resources, действительно является хорошей практикой, но не здесь, поскольку единственная информация, которую вы действительно закрываете, не должна закрываться, поэтому вы не можете ее использовать здесь. –

0

Вы можете использовать try-with-resources, если вы оберните System.in с помощью CloseShieldInputStream.

Я также рекомендовал бы использовать Scanner вместо InputStreamReader и BufferedReader, из-за его простоты:

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

Смотрите также: Closing BufferedReader and System.in

Смежные вопросы