Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从大文件中选择随机元素时出现NumberFormatException_Java_Random_Numberformatexception - Fatal编程技术网

Java 从大文件中选择随机元素时出现NumberFormatException

Java 从大文件中选择随机元素时出现NumberFormatException,java,random,numberformatexception,Java,Random,Numberformatexception,我有一个非常大的文件,其中包含这样的用户ID。大文件中的每一行都是一个用户id 149905320 1165665384 66969324 886633368 1145241312 286585320 1008665352 所以在这个大文件中,我将拥有大约3000万个用户id。现在我试图从那个大文件中随机选择用户id。下面是我的程序,但在某些时候它总是给我这样的异常-我不知道为什么会发生这种异常 Exception in thread "main" java.lang.NumberFormat

我有一个非常大的文件,其中包含这样的用户ID。大文件中的每一行都是一个用户id

149905320
1165665384
66969324
886633368
1145241312
286585320
1008665352
所以在这个大文件中,我将拥有大约3000万个用户id。现在我试图从那个大文件中随机选择用户id。下面是我的程序,但在某些时候它总是给我这样的异常-我不知道为什么会发生这种异常

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:59)
    at java.lang.Integer.parseInt(Integer.java:481)
    at java.lang.Integer.parseInt(Integer.java:510)
    at com.host.bulls.service.lnp.RandomReadFromFile.main(RandomReadFromFile.java:65)
下面是我的程序-

public static void main(String[] args) throws Exception {

    File f = new File("D:/abc.txt");
    RandomAccessFile file;

    try {

        file = new RandomAccessFile(f, "r");
        long file_size = file.length();

        // Let's start
        long chosen_byte = (long)(Math.random() * (file_size - 1));
        long cur_byte = chosen_byte;

        // Goto starting position
        file.seek(cur_byte);

        String s_LR = "";
        char a_char;

        // Get left hand chars
        for (;;)
        {
            a_char = (char)file.readByte();
            if (cur_byte < 0 || a_char == '\n' || a_char == '\r' || a_char == -1) break;
            else 
            {
                s_LR = a_char + s_LR;
                --cur_byte;
                if (cur_byte >= 0) file.seek(cur_byte);
                else break;
            }
        }

        // Get right hand chars
        cur_byte = chosen_byte + 1;
        file.seek(cur_byte);
        for (;;)
        {
            a_char = (char)file.readByte();
            if (cur_byte >= file_size || a_char == '\n' || a_char == '\r' || a_char == -1) break;
            else 
            {
                s_LR += a_char;
                ++cur_byte;
            }
        }

        // Parse ID
        if (cur_byte < file_size) 
        {
            int chosen_id = Integer.parseInt(s_LR);
            System.out.println("Chosen id : " + chosen_id);
        }
        else
        {
            throw new Exception("Ran out of bounds..");
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
文件f=新文件(“D:/abc.txt”);
随机存取文件;
试一试{
文件=新的随机访问文件(f,“r”);
long file_size=file.length();
//让我们开始吧
long selected_byte=(long)(Math.random()*(文件大小-1));
长当前字节=所选字节;
//转到起始位置
查找文件(当前字节);
字符串s_LR=“”;
字符a_char;
//左撇子
对于(;;)
{
a_char=(char)file.readByte();
如果(cur_byte<0|a|u char=='\n'|a|u char='\r'|a|u char===-1)中断;
其他的
{
s_LR=a_char+s_LR;
--cur_字节;
如果(cur_字节>=0)file.seek(cur_字节);
否则就断了;
}
}
//拿右手牌
当前字节=所选字节+1;
查找文件(当前字节);
对于(;;)
{
a_char=(char)file.readByte();
如果(cur_byte>=file_size|a|u char='\n'|a|u char='\r'|a|u char===-1)中断;
其他的
{
s_LR+=一个字符;
++cur_字节;
}
}
//解析ID
if(当前字节<文件大小)
{
int selected_id=Integer.parseInt(s_LR);
System.out.println(“所选id:+所选id”);
}
其他的
{
抛出新异常(“超出范围…”);
}
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}

我上面的代码有什么问题吗?

任何不可解析的字符串如果传递给
parseInt
方法,它将引发
NumberFormatException
。与空字符串一样,
Integer
也可以保存int可以具有的最大值和最小值2147483647或-2147483648。如果值超过该值,则会引发
NumberFormatException

If the string does not contain a parsable integer. ([Documentation][1])

似乎s_LR包含一个空字符串

根据我的计算,如果您使用windows样式的换行符(\r\n)并使用随机搜索点击“\r”,则可能会发生这种情况。然后,在将任何字符添加到s_LR之前,将应用两个循环中的中断条件


旁注:您正在使用一种非常非典型的java编码风格。虽然它对您的程序没有影响,但对于其他java程序员来说,它更难阅读/理解,因此您可能无法得到答案。

我尝试运行您的代码,发现了一个额外的错误-您必须在阅读前检查cur_byte,如下所示:

if (cur_byte < file_size) {
    a_char = (char) file.readByte();
}
if(当前字节<文件大小){
a_char=(char)file.readByte();
}
否则您将获得
EOFEException

对于您的示例abc.txt,我没有得到输入字符串的
java.lang.NumberFormatException:“
exception”


但是如果我在abc.txt中添加空行,我迟早会遇到这个异常。因此,问题在于abc.txt中的空行。

实际上,文件末尾或文件开头似乎有空字符串

或其中一个数字以表示整数

我看到两种解决办法:

  • 为您选择的每个元素添加空格和空字符串检查 从文件中读取
  • 将整数更改为长值

  • 代码风格说明:如果你中断你也不需要其他,为什么你.readByte()当你可以.readChar()?我会尝试以下方法:1)查看s_LR,看看内容是否是预期的2)如果你有很长的数字,可能整数不合适,那你就得用Long了。但您的异常更多地指向一个空字符串“”,也许您应该检查s_LR是否与此相对应。它是abc.txt文件末尾的新行吗?我也尝试过删除它,但仍然存在相同的问题。OPs代码在空字符串上肯定失败,并且值不是太高
    java.lang.NumberFormatException:对于输入字符串:“
    是的,我的代码在空字符串处失败,并且该空字符串来自这里,我猜
    string s_LR=”“我认为你是对的@André,很难理解整个过程,我试图画出大致的场景