为什么我在这个非常简单的代码中得到Java IO Exception?

时间:2016-09-09 18:11:49

标签: input groovy stream output

以下是我为了让自己更熟悉Groovy而创建的示例代码。我对Java有很好的理解,我现在正在尝试学习这门新语言。

class Activity {

    static void reverseString() {

        def text

        System.in.withReader{

            println "Enter a string to be reversed:"
            text = it.readLine()
        }


        print "\n";
        for (int i = text.length() - 1; i >= 0; i--){

            print text[i];

        }
    }


    static void main(String[] args) {

        def selection

        System.in.withReader{

            println "Select a project:"
            println "1 - Reverse String"
            selection = it.readLine()

        }

        switch (selection) {

            case "1":
                reverseString()
                break
        }
    }
}

我能够编译并运行此代码。我可以输入'1'然后按回车键,然后显示我方法的提示。此时我应该输入一个字符串来反转,但在我输入之前我得到IO异常:

  

线程“main”中的异常java.io.IOException:Stream closed

     

at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)

     

at java.io.BufferedInputStream.read(BufferedInputStream.java:336)

     

at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)

     

at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)

     

at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)

     

at sun.nio.cs.StreamDecoder.read0(StreamDecoder.java:127)

     

at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:112)

     

在java.io.InputStreamReader.read(InputStreamReader.java:168)

     

在Activity $ _reverseString_closure1.doCall(main.groovy:10)

     

在Activity.reverseString(main.groovy:7)

     

在Activity.main(main.groovy:39)

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

withReader()的目的是确保关闭流。因此,在main()方法中输入项目选择后,将关闭流。当reverseString()被执行时,为时已晚;流已关闭。

请勿关闭System.in(直接或通过withReader)。只关闭代码创建的流,而不是应用程序从调用者或运行时中的全局实例接收的流。