【问题标题】:Same code giving runtime error if i am using bufferedreader instead of scanner如果我使用 bufferedreader 而不是扫描仪,相同的代码会给出运行时错误
【发布时间】:2016-02-06 12:05:24
【问题描述】:
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {//BigInteger bi1, bi2, bi3;  
    long t,j,n;
    int i,x;

    BigInteger u,sum,temp,m;
    BigInteger[] a=new BigInteger[100009];  long[] b=new long[100009];
    long mm=1000000007,f;
        Scanner har=new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));           

        t=har.nextInt();
        for(f=0;f<t;f++)
        {   temp = BigInteger.valueOf(1);   sum = BigInteger.valueOf(0);    u = BigInteger.valueOf(0);              

                n=har.nextInt();    x=har.nextInt(); m=har.nextBigInteger();//String line = br.readLine();
    //String line = br.readLine(); // to read multiple integers line
        //String[] strs = line.trim().split("\\s+");
 //String[] s1 = br.readLine().split(" ");
 //StringTokenizer st = new StringTokenizer(br.readLine());
                for(i=1;i<=n;i++)
                {b[i]=har.nextInt();                

// b[i] = Integer.parseInt(st.nextToken());
//b[i] = Long.parseLong(System.console().readLine());    
//b[i]=Long.parseLong(s1[i-1]);
                }
        }
    }
}

input is of form 
t
n x m
a[1] a[2] a[3] .......a[n]

此代码在扫描仪上运行正常,但如果我尝试使用缓冲读取器或字符串标记器,则会出现运行时错误。 我是java新手,我需要使用大整数来解决问题的进一步部分。

【问题讨论】:

  • 你得到什么运行时错误?请分享堆栈跟踪。
  • 我在 //StringTokenizer st = new StringTokenizer(br.readLine()); 中遇到空点异常错误;
  • 您能否给我们不同的代码,即一个带有扫描仪和一个带有缓冲读取器的代码,以便我们进行测试? cmets 没有任何意义。
  • 您收到错误是因为没有行可读取,因此br.readLine() 返回null。
  • ideone.com/pDxQ81 -> 给出输入集的运行时错误ideone.com/Rcm5uI -> 输入集工作正常

标签: java java.util.scanner bufferedreader


【解决方案1】:

您的代码没有任何问题。您将BufferReader 定义为BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 并将String 定义为br.readLine();。

这个 sn-p 工作得非常好,并将输入字符串打印回控制台:

public static void main (String[] args)
{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println(br.readLine());
}

可能出现错误的一些可能性:

  1. 字符串标记器

    StringTokenizer st = new StringTokenizer(br.readLine());
    

    在将其传递给StringTokenizer 之前,请确保您从br.readLine() 得到一个字符串。

    String text = br.readLine();
    if(!StringUtils.isEmpty(text)) {
        StringTokenizer st = new StringTokenizer(br.readLine());
        /* Rest of the code */
    }
    
  2. 循环条件变量

    for(i=1;i<=n;i++)
    

    我没有看到初始化 n 的 BufferedReader 的任何内容。确保你正确初始化它。

这是一个快速代码sn-p:

public static void main (String[] args) throws Exception
{
    long j, n, f, mm = 1000000007;
    int i, x;
    BigInteger u, sum, temp, m;
    BigInteger[] a = new BigInteger[100009];  long[] b=new long[100009];

    Scanner har = new Scanner(System.in);

    long t = har.nextInt();
    for(f=0;f<t;f++)
    {   
        temp = BigInteger.valueOf(1);   
        sum = BigInteger.valueOf(0);    
        u = BigInteger.valueOf(0);
        n = har.nextInt();    
        x = har.nextInt(); 
        m = har.nextBigInteger();

        /* Goto Next Line */
        har.nextLine();

        /* Start Reading Line */
        String text = har.nextLine();
        System.out.println("String Value: " + text);
        if(null != text) {
            StringTokenizer st = new StringTokenizer(text);
            for(i = 1; i <= n; i++)
            {
                b[i] = Integer.parseInt(st.nextToken());
                System.out.println("Value of b[" + i + "] = " + b[i]);
            }
        }
    }
}

【讨论】:

  • 当我将字符串拆分为我需要作为数组输入的标记时出现错误
  • 检查br.readLine() 是否不是null,然后再将其传递给您的分词器。
  • n 是从用户扫描的值。我有扫描仪来获取 n 的值
  • 您一次只能使用一个,即Scanner 或BufferedReader。有什么特别的原因需要同时使用它们吗?
  • 是的,我必须将 m 的值作为一个大整数
猜你喜欢
  • 2017-03-15
  • 1970-01-01
  • 2011-01-14
  • 2017-07-08
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多