java,bufferedreader]integer.parseint(br.readline())和br.read()之间的差异-“0”

k4emjkb1  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(358)

我在计算 a+b 利用 BufferedReader . 我尝试了两种代码,每种都使用 read()readLine() ,但我不明白为什么第一个代码有效,而第二个代码无效。两者之间有什么区别吗 Integer.parseInt(br.readline())br.read()-'0' ? 它们不是都返回原语int吗?这是第一个代码。它很好用。

package level3;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;

public class ABPlusFast {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        int t = Integer.parseInt(br.readLine());

        for (int i=0; i<t; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            bw.write(a+b+"\n");
        }
        bw.flush();
        bw.close();
    }
}

这是第二个不起作用的代码。如果我给一个数字作为输入,那么它返回一个 NoSuchElementException() 在里面 StringTokenizer.class .

package level3;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;

public class ABPlusFast {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        int t = br.read();

        for (int i=0; i<(t-'0'); i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            bw.write(a+b+"\n");
        }
        bw.flush();
        bw.close();
    }
}
wwodge7n

wwodge7n1#

无法告诉您为什么一个版本“有效”,而另一个版本“无效”。。。除非你清楚:
在此上下文中,您所说的“有效”和“无效”是什么意思,以及
确切地说,您提供的是什么输入。
然而,这两个版本之间有着明显的区别。
第一个版本读取标准输入的整个第一行,并尝试将其解析为整数。
第二个版本读取标准输入的第一个字符,并尝试将其解释为一位数。这意味着:
如果第一行的数字中有两个或两个以上的数字,它将忽略除第一个以外的所有数字。
如果第一个字符不是数字,就会发生不好的事情1。
如果标准输入流为空,则 read() 会回来的 -1 坏事就会发生。
这不会消耗第一行的其余部分。那么当你打电话的时候 nextLine() 在第一个循环迭代中,它将返回第一行的其余部分。然后,当您尝试对其进行标记化和解析时,可能会发生不好的事情1。
我冒昧地说,第二个版本是不正确的。
1-我不打算详述。。。因为“坏东西”将取决于实际输入。

相关问题