小编典典

流关闭且未重新打开-Java

java

我可以轻松进行“作业”,但是我发现输入流的关闭存在一些问题。简单地说,我必须使用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异常,因为流已关闭。我不明白为什么会有这种问题。我认为通过尝试使用第一个代码中的资源来关闭流,但是随后通过尝试使用资源的第二个代码中来打开流。我的想法可能是错误的。


阅读 288

收藏
2020-11-30

共1个答案

小编典典

您的问题确实是由于try-with-resource语句关闭new InputStreamReader(System.in)而导致的,该语句在幕后也关闭了System.inin是的public static字段System)的基础输入流,以致您的modify方法中的该输入流System.in已经关闭,因此无法再读取,这就是为什么您会收到此异常。

2020-11-30