Java, BufferedReader] Integer.parseInt(br.readline()) 和 br.read()-'0' 的区别
Java, BufferedReader] Difference between Integer.parseInt(br.readline()) and br.read()-'0'
我正在尝试使用 BufferedReader
计算 a+b
。我尝试了两个代码,每个代码都使用 read()
和 readLine()
,但我不明白为什么第一个代码有效而第二个代码无效。 Integer.parseInt(br.readline())
和br.read()-'0'
有区别吗?他们不都是 return primitive 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();
}
}
这是第二个不起作用的代码。如果我给出一个数字作为输入,那么它 returns a NoSuchElementException()
in 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();
}
}
不可能告诉您为什么一个版本“有效”而另一个版本“无效”...除非您清楚:
在此上下文中,您所说的“有效”和“无效”是什么意思,以及
正是您提供的输入。
但是,这两个版本之间存在明显差异。
第一个版本读取标准输入的整个第一行并尝试将其解析为整数。
第二个版本读取标准输入的第一个字符并尝试将其解释为一个数字。这意味着:
如果第一行的数字中有两位或更多位,它将忽略除第一位以外的所有数字。
如果第一个字符不是数字,就会发生不好的事情1.
如果标准输入流是空的,read()
会return-1
并且会发生不好的事情1.
这不会消耗第一行的其余部分。因此,当您随后在第一个循环迭代中调用 nextLine()
时,它将 return 第一行的其余部分 。当您随后尝试标记化和解析 that 时,可能会发生坏事 1。
我敢说第二个版本不正确。
1 - 我不打算详细说明......因为“坏事”将取决于实际输入。
我正在尝试使用 BufferedReader
计算 a+b
。我尝试了两个代码,每个代码都使用 read()
和 readLine()
,但我不明白为什么第一个代码有效而第二个代码无效。 Integer.parseInt(br.readline())
和br.read()-'0'
有区别吗?他们不都是 return primitive 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();
}
}
这是第二个不起作用的代码。如果我给出一个数字作为输入,那么它 returns a NoSuchElementException()
in 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();
}
}
不可能告诉您为什么一个版本“有效”而另一个版本“无效”...除非您清楚:
在此上下文中,您所说的“有效”和“无效”是什么意思,以及
正是您提供的输入。
但是,这两个版本之间存在明显差异。
第一个版本读取标准输入的整个第一行并尝试将其解析为整数。
第二个版本读取标准输入的第一个字符并尝试将其解释为一个数字。这意味着:
如果第一行的数字中有两位或更多位,它将忽略除第一位以外的所有数字。
如果第一个字符不是数字,就会发生不好的事情1.
如果标准输入流是空的,
read()
会return-1
并且会发生不好的事情1.这不会消耗第一行的其余部分。因此,当您随后在第一个循环迭代中调用
nextLine()
时,它将 return 第一行的其余部分 。当您随后尝试标记化和解析 that 时,可能会发生坏事 1。
我敢说第二个版本不正确。
1 - 我不打算详细说明......因为“坏事”将取决于实际输入。