我可以轻松进行“作业”,但是我发现输入流的关闭存在一些问题。简单地说,我必须使用Java创建一个联系人“列表”应用程序,才能以正确的方式使用多态。所以我有一个Contact类和一个Private类(contact)。在这两个类中,都有一个Modify方法来更改变量的值。
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); } }
这是不会产生问题的Contact方法
@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中方法的替代。首先,我创建一个Private对象,然后调用Modify方法。我可以毫无问题地插入名称,姓氏和电子邮件,然后该方法将引发IO异常,因为流已关闭。我不明白为什么会有这种问题。我认为通过尝试使用第一个代码中的资源来关闭流,但是随后通过尝试使用资源的第二个代码中来打开流。我的想法可能是错误的。
您的问题确实是由于try-with-resource语句关闭new InputStreamReader(System.in)而导致的,该语句在幕后也关闭了System.in(in是的public static字段System)的基础输入流,以致您的modify方法中的该输入流System.in已经关闭,因此无法再读取,这就是为什么您会收到此异常。
new InputStreamReader(System.in)
System.in
in
public static
System
modify