Java BufferedReader结合StringTokenizer时st.toString()转int报错原因
异常根因
x =Integer.parseInt(st.toString()); 抛出运行时异常的核心原因是方法调用逻辑完全错误:
- StringTokenizer类的
toString()方法不会返回当前拆分到的字符串片段,而是返回该对象自身的字符串表示,格式通常为java.util.StringTokenizer@对象哈希值,内容包含类名、内存地址标识,根本不是纯数字字符串,传入Integer.parseInt()做类型转换必然触发NumberFormatException。 - 后续y、a变量的取值写法也存在冗余:
nextToken()方法本身的返回值就是String类型,不需要额外调用toString()做转换;且StringTokenizer默认以空格、换行、制表符等空白字符作为分隔符,不需要手动传入" "作为分隔参数。 - 代码中额外编写的X、Y、A取值范围校验属于多余逻辑:题目已经明确保证输入参数全部符合约束范围,额外添加这层判断不会带来任何收益,反而可能因为前置解析错误导致逻辑异常。
修复方案
正确的取值逻辑是逐次调用st.nextToken()获取拆分后的独立字符串片段,再转换为整数即可,修正后的可运行代码如下:
import java.util.*; import java.io.*; class Codechef { public static void main (String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); for (int i = 0; i < n; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); int a = Integer.parseInt(st.nextToken()); System.out.println(a >= x && a < y ? "YES" : "NO"); } br.close(); } }
补充说明
- 变量建议就近声明,不需要在方法开头集中定义所有循环变量,能有效提升代码可读性。
- 流资源使用完成后建议主动调用
close()方法释放资源,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Kyoko Chidori
相关产品推荐
相关产品推荐

