Java 解析大数时出现NumberFormatException?

Java 解析大数时出现NumberFormatException?,java,numberformatexception,Java,Numberformatexception,我知道这可能不是最有效的编码方式,但这是我到目前为止所拥有的,直到数字变大为止。代码应从文件中读取2个数字,例如“052”和“61”。然后,它应该将第一个数字从最大到最小排序,使数字尽可能大,并将第二个数字从最小到最大排序,使其尽可能小。(520和16)然后打印两者的差值,在本例中为504 其中两个数字是“3827367453723784675745843783623672348745389734268374687”和“16827614825126741727126354165712657162

我知道这可能不是最有效的编码方式,但这是我到目前为止所拥有的,直到数字变大为止。代码应从文件中读取2个数字,例如“052”和“61”。然后,它应该将第一个数字从最大到最小排序,使数字尽可能大,并将第二个数字从最小到最大排序,使其尽可能小。(520和16)然后打印两者的差值,在本例中为504

其中两个数字是“3827367453723784675745843783623672348745389734268374687”和“16827614825126741727126354165712657162351625176235741”。从最大值到最小值以及从最小值到最大值的数字排序很好,但是当我尝试将其解析为整数时,会抛出一个
NumberFormatException
。我想是因为这个数字太大,无法存储到
int
中,所以我尝试将其解析为
Long
,但结果是相同的错误

我所做的是将数字读作
String
s,然后制作一个
String
数组,将每个数字存储在一个单独的索引中。然后我制作了一个
int
数组,其中除了整数形式之外,我的数组基本相同,而不是
字符串。然后我对
int
数组进行排序。然后我创建了另一个
String
来存储新排序的数字,然后我尝试解析该
String
,这就是引发异常的地方

有什么建议吗

import java.io.*;    
import java.util.*;    
import java.text.*;    
import static java.lang.System.*;    

public class BigDif    
{    
    public static void main(String[] args) throws IOException    
    {    
        Scanner scan = new Scanner (new File ("BigDif.dat"));    
        int numRuns = scan.nextInt();    
        scan.nextLine();    

    for (int i = 0; i < numRuns; i++)    
    {
        String firstNum = scan.nextLine();
        String secondNum = scan.nextLine();
        String[] firstNum2 = new String[firstNum.length()];
        String[] secondNum2 = new String[secondNum.length()];
        int[] firstNum3 = new int[firstNum.length()];
        int[] secondNum3 = new int[secondNum.length()];
        int big = 0;
        int notBig = 0;
        String firstNum4 = null;
        String secondNum4 = null;
        int firstNum5 = 0;
        int secondNum5 = 0;
        for (int j = 0; j < firstNum.length(); j++)
        {
            firstNum2[j] = Character.toString(firstNum.charAt(j));
        }
        for (int j = 0; j < secondNum.length(); j++)
        {
            secondNum2[j] = Character.toString(secondNum.charAt(j));
        }
        for (int j = 0; j < firstNum2.length; j++)
        {
            firstNum3[j] = Integer.parseInt(firstNum2[j]);
            secondNum3[j] = Integer.parseInt(secondNum2[j]);
        }
        Arrays.sort(firstNum3);
        Arrays.sort(secondNum3);
        for (int m = 0; m < firstNum3.length; m++)
        {
            if (m == 0)
                firstNum4 = (Integer.toString(firstNum3[m]));
            else
                firstNum4 = (Integer.toString(firstNum3[m]))+ firstNum4;
        }

        for (int m = 0; m < secondNum3.length; m++)
        {
            if (m == 0)
                secondNum4 = (Integer.toString(secondNum3[m]));
            else
                secondNum4 += (Integer.toString(secondNum3[m]));
        }

        firstNum5 = Integer.parseInt(firstNum4); //the exception is thrown here
        secondNum5 = Integer.parseInt(secondNum4);

        if (firstNum5 >= secondNum5)
        {
            big = firstNum5;
            notBig = secondNum5;
        }
        else
        {
            big = secondNum5;
            notBig = firstNum5;
        }

        out.println(big - notBig);
    }
    }    
}    
import java.io.*;
导入java.util.*;
导入java.text.*;
导入静态java.lang.System.*;
公共类BigDif
{    
公共静态void main(字符串[]args)引发IOException
{    
扫描仪扫描=新扫描仪(新文件(“BigDif.dat”);
int numRuns=scan.nextInt();
scan.nextLine();
for(int i=0;i=第二个NUM5)
{
大=第一个NUM5;
notBig=secondNum5;
}
其他的
{
大=次NUM5;
notBig=firstNum5;
}
out.println(大-小);
}
}    
}    

3827367453723784675745843783623672348745389734268374687对于长时间也太大。使用
biginger
,允许任意大整数。

您可以尝试使用大整数的范围,因为
16827614825126741727126354165712665716235471625176235741
38273674537237846757458437836236728745389734268374687
太大,超出了整数

尝试构造函数

将BigInteger的十进制字符串表示形式转换为 大整数。字符串表示法由可选的减号组成 符号后跟一个或多个十进制数字序列。这个 字符到数字的映射由character.digit提供。弦 不能包含任何无关字符(例如空格)


1682761482512674172712635416571265716235471625176235741
远远超出了整数的范围。