令人崩溃的io

e_forrest 2010-11-29 11:03:23

import java.io.*;
import java.util.*;
import java.math.*;

public class ShuXueFunction {

public ShuXueFunction() {
}

public void fun(int num)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i<num;i++){
Float.parseFloat(br.readLine());
}
}
public static void main(String[] args) throws Exception{
new ShuXueFunction().fun(5);
}
}


上面这个代码,编译通过,下面是运行的测试结果
当我输入第一次(也就是下面的4)的时候还正常
但输入第二次(3)的时候,就出现下面这个异常



4
3
Exception in thread "main" java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:994)
at java.lang.Float.parseFloat(Float.java:422)
at ShuXueFunction.fun(ShuXueFunction.java:20)
at ShuXueFunction.main(ShuXueFunction.java:24)

Process completed.



我百思不得其解 这是为什么呢?
经过大量测试,下面的代码竟然可以成功运行!这又是为什么呢?


import java.io.*;
import java.util.*;
import java.math.*;

public class ShuXueFunction {

public ShuXueFunction() {
}

public void fun(int num)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i<num;i++){
System.out.println();
Float.parseFloat(br.readLine());
}
}
public static void main(String[] args) throws Exception{
new ShuXueFunction().fun(5);
}
}




各位高手,我求解!!!
...全文
427 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyouxinboy 2010-11-30
  • 打赏
  • 举报
回复
高手好多啊
e_forrest 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 sunyiz 的回复:]

这样再试试
看一下究竟是什么字符引起的
如果badline后面只打印出空白,那估计是不可见字符
如"\n" "\r"之类的
Java code
public class ShuXueFunction {

public ShuXueFunction() {
}

public void fun(int num)throws Exception{
……
[/Quote]

输出结果
5
4
badline:
3
2
badline:

badline后面什么都没有是空的
sunyiz 2010-11-30
  • 打赏
  • 举报
回复
这样再试试
看一下究竟是什么字符引起的
如果badline后面只打印出空白,那估计是不可见字符
如"\n" "\r"之类的
public class ShuXueFunction {

public ShuXueFunction() {
}

public void fun(int num)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i<num;i++){
String str = br.readLine();
try {
Float.parseFloat(str);
} catch (NumberFormatException e) {
System.out.println("badline:" + str);
}
}
}
public static void main(String[] args) throws Exception{
new ShuXueFunction().fun(5);
}
}
skyxiuli 2010-11-30
  • 打赏
  • 举报
回复
学习了。。。
e_forrest 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 sunyiz 的回复:]

看一下会不会打印出null,以及会打印出几次null
[/Quote]

和以前一样,当输入第二个数字的时候,输出一样的异常
sunyiz 2010-11-30
  • 打赏
  • 举报
回复
看一下会不会打印出null,以及会打印出几次null
sunyiz 2010-11-30
  • 打赏
  • 举报
回复
楼主,为了能知道你的环境有什么问题
可以这样试一下
把程序改成这样
import java.io.*;
import java.util.*;
import java.math.*;

public class ShuXueFunction {

public ShuXueFunction() {
}

public void fun(int num)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i<num;i++){
String str = br.readLine();
if (str == null) {
System.out.println("null");
} else {
Float.parseFloat(str);
}
}
}
public static void main(String[] args) throws Exception{
new ShuXueFunction().fun(5);
}
}
e_forrest 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 funnyrabbit 的回复:]

trim绝对不能忽略
[/Quote]

这真不是trim的事。。。
e_forrest 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 e_forrest 的回复:]

最后一顶,帖子流出第一页就结贴。到目前位置分给17楼的兄弟。
[/Quote]

纠结谈不上吧,感觉没有满意的答案。。早开始搞别的了,但是这个东西,还真打算搞清楚。。。要是真搞不清楚,以后工作了遇到大牛再问好了。
FunnyRabbit 2010-11-30
  • 打赏
  • 举报
回复
trim绝对不能忽略
caofaping 2010-11-30
  • 打赏
  • 举报
回复
楼主还在纠结这个问题?
e_forrest 2010-11-30
  • 打赏
  • 举报
回复
最后一顶,帖子流出第一页就结贴。到目前位置分给17楼的兄弟。
e_forrest 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 sunyiz 的回复:]
因为System.out.println();
之后会自动换行
会保证你当前的控制台中是一个“干净的行”
而你出错的程序,在你输入了第二个回车之后
可能在的当前输入行中就已经有了一个隐藏的“\n”字符了,这是不可见字符

就像我给你改的那个程序,也不会直接抛出异常一样,都是把错误的字符给处理掉了
[/Quote]

非常感谢,结贴
sunyiz 2010-11-30
  • 打赏
  • 举报
回复
因为System.out.println();
之后会自动换行
会保证你当前的控制台中是一个“干净的行”
而你出错的程序,在你输入了第二个回车之后
可能在的当前输入行中就已经有了一个隐藏的“\n”字符了,这是不可见字符

就像我给你改的那个程序,也不会直接抛出异常一样,都是把错误的字符给处理掉了
e_forrest 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 sunyiz 的回复:]

引用 50 楼 e_forrest 的回复:
输出结果
5
4
badline:
3
2
badline:

badline后面什么都没有是空的
那估计就是\n了

现在有以下几种可能
1、键盘问题
2、系统中的其它软件引起
3、运行环境问题
4、其它原因

是不是前两种情况可以做一个测试
楼主用你的这台电脑
打开个记事本程序
然后输入
5 回车
4……
[/Quote]


不是前两个类的原因,应该就是运行环境的问题了。
我用的JCreator,我传给朋友用Eclipse运行都没有问题。
看来应该重装JDK,再换个开发工具了啊

谢谢您一直以来对此贴的关注!
我还有最后一个疑问,就是如果是运行环境有问题的话
为什么我加上一句System.out.println();就没问题了呢?(参见1楼下面那块代码)
sunyiz 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 e_forrest 的回复:]
输出结果
5
4
badline:
3
2
badline:

badline后面什么都没有是空的[/Quote]
那估计就是\n了

现在有以下几种可能
1、键盘问题
2、系统中的其它软件引起
3、运行环境问题
4、其它原因

是不是前两种情况可以做一个测试
楼主用你的这台电脑
打开个记事本程序
然后输入
5 回车
4 回车
3 回车
2 回车

看下记事本中是
5
4
3
2


还是
5
4

3
2

(就是明明是这样输入的,中间确莫名其妙的空了一行)
如果是这样,那估计不是键盘问题,就是系统中有什么软件(比如按键精灵一类的)
你的输入触发了什么脚本,而造成自动输入了一个回车

当然,如果没有空这一行
那应该就是这个java运行环境的问题了
不知道楼主是怎么运行程序的?
用的是eclipse一类的工具
还是命令行执行的?
e_forrest 2010-11-29
  • 打赏
  • 举报
回复
手动置顶,继续等!
e_forrest 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 caofaping 的回复:]

引用 21 楼 e_forrest 的回复:
引用 17 楼 songdeng_1990 的回复:

换个运行环境,应该就好了。


你是建议我重新安装一遍jdk吗?


我只能说事出有因!
[/Quote]

啊?
caofaping 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 e_forrest 的回复:]
引用 17 楼 songdeng_1990 的回复:

换个运行环境,应该就好了。


你是建议我重新安装一遍jdk吗?
[/Quote]

我只能说事出有因!
e_forrest 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 songdeng_1990 的回复:]

换个运行环境,应该就好了。
[/Quote]

你是建议我重新安装一遍jdk吗?
加载更多回复(33)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧