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);
    }
}
各位高手,我求解!!!

解决方案 »

  1.   

    Exception in thread "main" java.lang.NumberFormatException: empty String
    应该是你输入的问题,不小心直接按了回车.另外,流用完,最好关闭。
    public void fun(int num)throws Exception{
    ......
    br.close();
        }
      

  2.   

    一楼正解,这个问题是由于你第一次输入4,程序取得4处理正确。然后你输入回车,此时系统也是做了次处理的。它会拿回车去转换成float此时就抛异常了。还有也是一楼讲的。IO用后要记得关连接。。
      

  3.   

    正解,
    改成这样br.readLine()。trim();
      

  4.   

    楼主你这个程序写的是读5个数
    所以一定要连续输入5行的数字
    如果你某一行什么都没输入,直接按回车
    readLine()读不到东西返回null
    程序里相当于这样
    Float.parseFloat(null);
    这样就会出错了,这个parseFloat方法的参数不能为null
      

  5.   

    Exception in thread "main" java.lang.NumberFormatException: empty String
    因为你输完3之后连续打了2下回车照成的!不信你试试.....
      

  6.   

    至于原因...是这样
    你输入一个4 然后输出回车,默认的话只会读取4
    然后你输入一个3 连续2个回车,那第二个回车就相当于你 第三次的输入了,系统读取了回车符好进行转化,所以就报 empty String
     错误了
      

  7.   


    如何不按回车连续输出5行?
    我这个程序是想这样比方说有一个数组
    要求用户,输入第一个数,存进去
    然后要求用户再输入一个数,再存进去我觉得我实现的就是这么个功能啊?因为我修改过的那个程序,就是加了System.out.println();之后的这个程序就是我要的效果
      

  8.   

    你出错的代码我试过了,运行正常。。用的Eclipse。另外,就算你编译的时候有错(也许人品,呵呵),也不应该是楼上说的原因,因为readline函数每次正是以回车或者换行符为一次读取结束标志。
    正常情况下(即不考虑人品原因),抛出empty string 应该是输入一次4,按了一次回车,然后再按一次回车,出现的。换个运行环境,应该就好了。
      

  9.   


    LS说的很对readline()函数就是以换行符或回车符作为读取结束标志的API:
    public String readLine()
                    throws IOException读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 确实如您所说其实这是我昨天写的一段程序里简化出来的,我为什么要简化出来呢?
    因为昨天那段代码我测试过后运行正常,可是今天一测试,就出现上面那个问题了我向上天保证,我真的就只按了一次回车我测试了几十次,不能每次都按两次回车吧?看来真的是RP问题了可是问一下,如果代码这么不稳定,那岂不是说,如果在我这运行的正常,到别人那运行的不正常,如果我是个程序员,我该怎么跟老板交代啊我总不能说,老板你来看呀,在我的机器上运行正常吧
      

  10.   


    对于,我加了一句System.out.println();就运行正常了,有什么看法
      

  11.   


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

  12.   


    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);//首先这里已经有数字值,运行时其实是在运行关于5计算。
        }
    }
      

  13.   

    好多回复啊,看不过来。这里我只说下自己的看法:你输入时使用\n\r代替回车,如1\n\r2\n\r3\n\r4,\n\r在windows里就代表换行的意思
      

  14.   

    楼主,为了能知道你的环境有什么问题
    可以这样试一下
    把程序改成这样
    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);
        }
    }
      

  15.   

    看一下会不会打印出null,以及会打印出几次null
      

  16.   

    这样再试试
    看一下究竟是什么字符引起的
    如果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);
        }
    }
      

  17.   


    输出结果
    5
    4
    badline:
    3
    2
    badline:badline后面什么都没有是空的
      

  18.   

    那估计就是\n了现在有以下几种可能
    1、键盘问题
    2、系统中的其它软件引起
    3、运行环境问题
    4、其它原因是不是前两种情况可以做一个测试
    楼主用你的这台电脑
    打开个记事本程序
    然后输入
    5 回车
    4 回车
    3 回车
    2 回车看下记事本中是
    5
    4
    3
    2
    还是
    5
    43
    2

    (就是明明是这样输入的,中间确莫名其妙的空了一行)
    如果是这样,那估计不是键盘问题,就是系统中有什么软件(比如按键精灵一类的)
    你的输入触发了什么脚本,而造成自动输入了一个回车当然,如果没有空这一行
    那应该就是这个java运行环境的问题了
    不知道楼主是怎么运行程序的?
    用的是eclipse一类的工具
    还是命令行执行的?
      

  19.   

    不是前两个类的原因,应该就是运行环境的问题了。
    我用的JCreator,我传给朋友用Eclipse运行都没有问题。
    看来应该重装JDK,再换个开发工具了啊谢谢您一直以来对此贴的关注!
    我还有最后一个疑问,就是如果是运行环境有问题的话
    为什么我加上一句System.out.println();就没问题了呢?(参见1楼下面那块代码)
      

  20.   

    因为System.out.println();
    之后会自动换行
    会保证你当前的控制台中是一个“干净的行”
    而你出错的程序,在你输入了第二个回车之后
    可能在的当前输入行中就已经有了一个隐藏的“\n”字符了,这是不可见字符就像我给你改的那个程序,也不会直接抛出异常一样,都是把错误的字符给处理掉了