BufferedReader提供非零退出代码

时间:2014-08-16 19:08:03

标签: java java.util.scanner bufferedreader

问题 一个简单的编程question,涉及从控制台读取N,T次数并对其进行简单计算。

约束:

1≤T≤1000

2≤N≤100000000

由于BufferedReader通常比Scanner快,我使用它但程序退出时使用非零退出代码,而使用Scanner解决了问题。

由于两者在我的计算机上运行正常,我怀疑这是一个内存问题。

问题:

  1. 我的假设是BufferedReader比Scanner更快吗?
  2. BufferedReader是否使用更多内存?如果是,是错误的原因吗?
  3. 代码:

    使用BufferedReader,抛出错误

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
        public static void main(String[] args) throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int T = Integer.parseInt(br.readLine());
            for (int i=0; i<T; i++) {
                int N = Integer.parseInt(br.readLine());
                int res = (N/2)+1;
                System.out.println(res);
            }
            br.close();
        }
    }
    

    使用Scanner返回正确输出的代码:

    import java.io.IOException;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) throws IOException{
            Scanner sc = new Scanner(System.in);
            int T = Integer.parseInt(sc.nextLine());
            for (int i=0; i<T; i++) {
                int N = Integer.parseInt(sc.nextLine());
                int res = (N/2)+1;
                System.out.println(res);
            }
            sc.close();
        }
    }
    

3 个答案:

答案 0 :(得分:3)

  1. 从JDK 7开始,BufferedReader使用比Scanner更大的缓冲区(我认为8192c vs 1024c),所以它使用更多内存,并且可以在大输入上实现更快的运行时间。
  2. 这可能是您的问题的根源(或者可能是因为为此问题编写测试的人有错误),因为我自己测试了您的BufferedReader代码并且看不到任何问题。

答案 1 :(得分:1)

  

我的假设是BufferedReader比Scanner更快吗?

不是在这种情况下,因为程序的速度受到键入速度的限制。与此相比,Scanner和BufferedReader之间的任何差异都是微不足道的。

  

BufferedReader是否使用更多内存?

未指定。

  

如果是,是错误的原因吗?

出现错误的原因是什么?由于你没有发布你得到的错误,这个问题是无法回答的。但是我没有理由相信你有记忆问题。

答案 2 :(得分:-1)

我遇到了同样的错误(BufferedReader上有错误)。这是因为你忘了把BufferedReader放在try catch块中。在主要功能之后我也有throws IOException,但这还不够。所以它不是内存问题。

正确的代码可能是这样的:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException{

        BufferedReader br = null;
        try {  
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             int T = Integer.parseInt(br.readLine());
             for (int i=0; i<T; i++) {
             int N = Integer.parseInt(br.readLine());
             int res = (N/2)+1;
             System.out.println(res);
        }catch(Exception e) {
             e.printStackTrace();
        }finally{
             try{
                 br.close();
             }catch ( Exception e){
                 e.printStackTrace();
             }
        } // end of try catch
    }
}

祝你好运!