2016-09-09 7 views
0

以下は、Groovyをよく理解するために作成したサンプル・コードです。私はJavaについてよく理解しており、今この新しい言語を学びたいと考えています。この非常に単純なコードでJava IO例外が発生するのはなぜですか?

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'を入力してEnterを押すことができます。そして、私の方法からのプロンプトが表示されます。この時点で、私は逆に文字列を入力することが出来るのですが、私は入ることができる前に、私はIO例外を取得:「メイン」にjava.io.IOExceptionスレッドで

例外:ストリームは、Javaで

を閉じましたsun.nio.cs.StreamDecoder.readBytesでjava.io.BufferedInputStream.readで.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)

(BufferedInputStream.java:336)

(StreamDecoder.java :284)

sun.nio.cs.StreamDecoder.implReadに

(StreamDecoder.java:326)sun.nio.cs.StreamDecoder.readで

(StreamDecoder.java:178)sun.nio.csで

java.io.InputStreamReader.readで.StreamDecoder.read0 sun.nio.cs.StreamDecoder.readで(StreamDecoder.java:127)

(StreamDecoder.java:112)

(InputStreamReader.java:168 )

at $ _reverseString_closure1.doCall(main.groovy:10)

Activity.mainで(main.groovy:39):Activity.reverseString(7 main.groovy)で

は、私はここで何をしないのですか?

+0

"ストリームが閉じられました" - 例外が理由を示します。 – duffymo

+0

ストリームが閉じているのはなぜですか? @duffymo –

+0

それはあなたにも行番号を教えてくれます。これはあなたのデバッグスキルを発揮するチャンスです。あなたはIDEを持っていますか?ブレークポイントを設定し、ステップスルーします。もしあなたがいたらあなたはすでに答えを持っていただろう。 – duffymo

答えて

1

は、ストリームが確実に閉じられるようにすることです。したがって、プロジェクト選択がmain()メソッドで入力された後、ストリームは閉じられます。 reverseString()が実行されると、それは遅すぎます。ストリームは閉じられます。

System.in(直接、またはwithReader)を閉じないでください。コードが作成するストリームのみ、アプリケーションが呼び出し元から受け取るストリーム、またはランタイムのグローバルインスタンスではありません。

+0

ストリームを開いて複数の読み込みを許可するにはどうすればよいですか?私はスキャナメソッドがあることを知っていますが、これを行うためのGroovy固有の方法はありますか? –

+1

@LakshanSivananthanあなたは 'System.in'を開かず、閉じてはいけません。これはランタイムによって管理されるストリームです。だから、「ストリームを開いて複数の読み込みを許可する」というのは間違ったアプローチです。 'reverseString()'メソッドは、ストリームをパラメータとして受け入れ、それを開いたり閉じたりするために呼び出し元に依存する必要があります。 – erickson

+0

@erickson whoops ...脳凍結...削除済み –

関連する問題