24302


Aizu Online
ジャッジというサイトのこの問題(<http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_4_D>)  
を解いています。

以下のコードを提出するとRuntime errorになってしまうのですが、どこが間違っているか教えてください。

標準入力を2行ともBufferedReaderで取得すれば成功するのですが、1行目をScanner、2行目をBufferedReaderで取得するとRuntime
errorになります。  
Scannerが何かいけないような気はするのですが、どういう問題が発生しているのかよくわかりません。

[code]

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Scanner;
    
    public class test{
    
    
        public static void main(String[] args){
    
            Scanner scan = new Scanner(System.in);
            BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
    
            try{
                int n=scan.nextInt();
                String s=reader.readLine();
                String[] str =s.split(" ");
                int array_num[]= new int[n];
                long max, min, sum;
                sum=0;
                max=-1000000;
                min=1000000;
    
                for(int i=0;i<n;i++){
                    array_num[i]=Integer.parseInt(str[i]);
                    sum+=array_num[i];
    
                    if(array_num[i]>max)max=array_num[i];
                    if(array_num[i]<min)min=array_num[i];
                }
    
                System.out.println(min+" "+max+" "+sum);
    
    
    
                scan.close();
                reader.close();
            }catch(IOException e){
                System.out.println("エラー:"+e);
    
            }
    
        }
    
    }
    
[/code]


CC BY-SA 3.0
2016-04-24T08:06:38.923
24299
2016-04-27T12:35:56.813
2016-04-27T12:35:56.813
2238
15279
question
java
ScannerとBufferedReaderの違いについて


一般的に、ひとつの入力 (`System.in`) を包む形で処理するオブジェクトを、２つ生成するのはコード的にとても怪しい感じがします。

実際に調べてみたところ、 `Scanner` は内部で `InputStreamReader` を利用していますがこ、これについては
[公式ドキュメント](https://docs.oracle.com/javase/7/docs/api/java/io/InputStreamReader.html)
より、

> To enable the efficient conversion of bytes to characters, more bytes  
>  may be read ahead from the underlying stream than are necessary to  
>  satisfy the current read operation.

なので、少なくとも `Scanner` を利用したら、他の経路で同一の`System.in`を読み込むのは避けた方がいいと思います。

* * *

なので、今回のケースでは、最初の scanner の結果分だけ、 for 文で `nextInt`するのがいいのではないでしょうか。


CC BY-SA 3.0
2016-04-24T09:50:27.493
24302
2016-04-24T09:57:31.280
2016-04-24T09:57:31.280
754
754
24299
answer