看起来是数字的字符串导致NumberFormatException异常

5

我有一个关于JAVA程序的小问题。我正在尝试做一个插入排序算法,但是似乎将程序通过stdin获取到的字符串转换成数字时出了问题。程序似乎可以处理少量数字,但无法处理以下数字:

https://dl.dropboxusercontent.com/u/57540732/numbers.txt

这是我的算法:

public class Sort {

    private static ArrayList<String> insertionSort(ArrayList<String> arr) {
        for (int i = 1; i < arr.size(); i++) {
            int valueToSort = Integer.parseInt(arr.get(i).trim());
            int j = i;
            while (j > 0 && Integer.parseInt(arr.get(j - 1).trim()) > valueToSort) {
                arr.set(j, arr.get(j-1));
                j--;
            }
            arr.set(j, Integer.toString(valueToSort));
        }
        return arr;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<String> al;
        String inputNumbers = sc.nextLine();
        String[] xs = inputNumbers.split(" ");
        al = new ArrayList<String>(Arrays.asList(xs));
        al = insertionSort(al);
        for (int i = 0; i<al.size(); i++) {
            System.out.print(al.get(i) + " ");
        }
    }
}

它可以处理少量数字,但无法处理我提供给你的那些文件。我得到以下异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "4531"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at Sort.insertionSort(Sort.java:10)
    at Sort.main(Sort.java:25)

我不知道为什么会出现这个异常,因为输入的字符串是一个数字(4531)。有什么建议吗? 我无法将文件中的所有数字复制粘贴到终端,所以我使用了这个命令:

javac Sort.java
java Sort < numbers.txt

我认为问题出在nextLine()函数上。 - Kumaresan Perumal
Scanner类有一个叫做nextInt()和hasNextInt()的方法。也许你应该尝试使用它们,而不是将字符串解析为整数。 - abekenza
1个回答

4

您的 "4531" 中存在不可见字符。

如何修复:

步骤如下:

    al = new ArrayList<String>(Arrays.asList(xs));

写作:

    List a2 = new ArrayList<String>(a1.size());
    for(String s: a1) {
       a2.add(s.replaceAll("[^\\d.]", ""));    
    }
    a1 = a2;

如何找到这个字符:

在之后:

    al = new ArrayList<String>(Arrays.asList(xs));

请编写:

    List a2 = new ArrayList<String>(a1.size());
    int line = 0;
    for(String s: a1) {
       int i = 0;
       for(char c: str.trim().toCharArray() {
           if(!Character.isDigit(c) {
               System.out.println("In line" + line + " char " + i + " isn't digit")
           }
           i++;
       }  
       line++;    
    }

没错!完美的答案。接受这个答案。谢谢。 - golobitch
1
输入似乎没有浮点数值,因此可以使用\\D代替[^\\d.] - Pshemo
1
稍微改进一下:这个“不可见字符”是一个UTF-8字节顺序标记 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接