Bondye Bondye - 1 year ago 82
Java Question

Stream closed and not reopened - Java

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

public void modify() throws IOException {
System.out.println("Numero di cellulare precedente: " + cell);
System.out.println("Inserire nuovo numero");
try (InputStreamReader ir = new InputStreamReader(;
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.

Answer Source

Your problem is indeed due to the try-with-resource statement that closes new InputStreamReader( which behind the scene closes also the underlying input stream that is (in is a public static field of System) such that in your modify method is already closed and then cannot be read anymore this is why you get this exception.