使用缓冲读取器不会给运行时错误,但使用扫描程序给出在线判断?

时间:2013-09-25 14:36:18

标签: java

我正在做this个问题。我提交了以下使用扫描仪读取输入的代码。

import java.io.*;
import java.math.*;
import java.util.*;
import java.lang.*;

class Main{ 

public static void main(String[] args)throws java.lang.Exception{
    Scanner cin = new Scanner(System.in);
    TreeMap<String, Integer> map = new TreeMap<String, Integer>();
    int trees = 0;
    while(true){
        String tree = cin.nextLine();
        if(tree==null){
            break;
        }
        trees++;
        if(map.containsKey(tree)){
            map.put(tree, map.get(tree)+1);
        }else{
            map.put(tree, 1);
        }
    }
    for(String key : map.keySet()){

    }

    Iterator<String> itr = map.keySet().iterator();
    while(itr.hasNext()){
        String tree = itr.next();
        System.out.print(tree + " " );
        double percent = (double)map.get(tree)/trees*100;
        System.out.format("%.4f\n", percent);
    }

}
}

但是我遇到了运行时错误。但是当我提交相同的代码,但这次我使用缓冲的阅读器,然后我的答案被接受。这是判断的问题还是我错过了java的输入输出例程的一些功能。

我应该使用缓冲式阅读器还是扫描仪来更有效地读取数据?

import java.io.*;
import java.math.*;
import java.util.*;
import java.lang.*;

class Main{ 

public static void main(String[] args)throws java.lang.Exception{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    TreeMap<String, Integer> map = new TreeMap<String, Integer>();
    int trees = 0;
    while(true){
        String tree = br.readLine();
        if(tree==null){
            break;
        }
        trees++;
        if(map.containsKey(tree)){
            map.put(tree, map.get(tree)+1);
        }else{
            map.put(tree, 1);
        }
    }
    for(String key : map.keySet()){

    }

    Iterator<String> itr = map.keySet().iterator();
    while(itr.hasNext()){
        String tree = itr.next();
        System.out.print(tree + " " );
        double percent = (double)map.get(tree)/trees*100;
        System.out.format("%.4f\n", percent);
    }

}
}

1 个答案:

答案 0 :(得分:3)

阅读您正在使用的方法的合同。 BufferedReader#readLine()如果是EOF则会返回null; Scanner#nextLine()“抛出NoSuchElementException - 如果找不到任何行。”如果您想使用Scanner,您的循环条件需要检查cin.hasNextLine()