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 Java, just to use the polymorphism in the correct way. So I have a class Contact and a subclass Private (contact). In both class there is a modify method to change the value of the variables.
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); }
}
This is the Contact method that doesn't create 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);
}
}
Instead, this is the override of the method in Private. In the main, I create a Private object and I call the modify method. I can insert name, surname and e-mail without problem, then the method throws an IO exception because the stream is closed. I can't understand why I have this kind of problem. I think that the stream is closed by try with resources in the first code, but then it is opened in the second code by another try with resources. Probably something in my idea is wrong.
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 isSystem.in
(in
is apublic static
field ofSystem
) such that in yourmodify
methodSystem.in
is already closed and then cannot be read anymore this is why you get this exception.You could still use
try-with-resources
if you wrapSystem.in
with aCloseShieldInputStream
.I would also recommend using a
Scanner
instead of theInputStreamReader
andBufferedReader
, because of it's simplicity:See also: Closing BufferedReader and System.in