【问题标题】:Creating readKey method in Java [duplicate]在Java中创建readKey方法[重复]
【发布时间】:2018-02-01 01:55:59
【问题描述】:

我正在尝试在 Java 中创建静态方法,该方法将返回从用户键盘输入收集的字符串。非静态方法 readKey 工作正常,但我需要创建 ATM 类的实例,而不是创建 BufferedReader。

public class ATM {

    public String readKey() {
        String key = null;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        try {
            key = bufferedReader.readLine();
        } catch (IOException e) {

            e.printStackTrace();
        }
        try {
            bufferedReader.close();
        } catch (IOException e) {

            e.printStackTrace();
        }
    return key;
    }
    public static String rKey() {
        String key = null;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        try {
            key = bufferedReader.readLine();
        } catch (IOException e) {

            e.printStackTrace();
        }
        try {
            bufferedReader.close();
        } catch (IOException e) {

            e.printStackTrace();
        }

    return key;
    }



    public static void main(String[] args) {


            String cardNumber = rKey();


            String cardPin = rKey();



    }
}

在提供一些输入并按 Enter 时,我收到以下错误:

java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at packageX.ATM.rKey(ATM.java:31)
at packageX.ATM.main(ATM.java:68)

感谢您的宝贵时间,希望我的问题得到很好的描述。

【问题讨论】:

  • 好吧,不要关闭流。
  • 但是在关闭流之前我已经将值传递给键 String - 对吧?

标签: java


【解决方案1】:

首先,“DRY out”你的代码。

rKeyreadKey 正在做同样的事情。


您的错误发生是因为第一个 rKey() 关闭了 System.in,因此第二个将失败,因为只有一个 System.in,如果您打算继续,则不应在应用程序的整个生命周期内关闭它用它。

您可以将此模式用于非静态用途。

class ATM {
    private Scanner sc = new Scanner(System.in);

    public String readKey() {
        String key = null;
        if (sc.hasNextLine()) {
            key = sc.readLine();
        }
        return key;
    }

    public static void main(String[] args) {
        ATM a = new ATM();

        String cardNumber = a.readKey();
        String cardPin = a.readKey();
    }
}

非静态方法 readKey 工作正常,但我需要创建 ATM 类的实例而不是创建 BufferedReader

是的,因为你cannot access a non-static resource from a static context

【讨论】:

  • 哦,我明白了!在 public String readKey() 我可以关闭流,但是当我创建静态方法时,我无法关闭流,因为它将永远关闭。我的理解正确吗?如果是,那么是否可以在静态方法中关闭并重新打开流?
  • @WontProvide 这与静态与非静态无关。当您在 Reader(或另一个 InputStream)中包装 InputStream 时,关闭包装器对象(在本例中为您的 BufferedReader)会关闭底层 InputStream。关闭 System.in 后,无论您是用静态方法还是非静态方法关闭它,都无法再次读取它。
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 2011-03-19
  • 2012-10-17
  • 2017-02-12
  • 1970-01-01
  • 2014-05-04
  • 2014-04-02
  • 2017-04-06
相关资源
最近更新 更多