I have an easy \'homework\' to do, but I have found a little problem with the closure of the input stream. To put it simply, I have to make a contact \'list\' application in Jav
You could still use try-with-resources
if you wrap System.in
with a CloseShieldInputStream
.
I would also recommend using a Scanner
instead of the InputStreamReader
and BufferedReader
, because of it's simplicity:
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);
}
}
}
See also: Closing BufferedReader and System.in
Your problem is indeed due to the try-with-resource statement that closes new InputStreamReader(System.in)
which behind the scene closes also the underlying input stream that is System.in
(in
is a public static
field of System
) such that in your modify
method System.in
is already closed and then cannot be read anymore this is why you get this exception.