Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 我错过了什么?数字格式异常错误_Java_String_File_Casting - Fatal编程技术网

Java 我错过了什么?数字格式异常错误

Java 我错过了什么?数字格式异常错误,java,string,file,casting,Java,String,File,Casting,我想从一个只包含数字的txt文件中读取。这样的文件是UTF-8格式的,并且数字之间仅用新行分隔(没有空格或任何其他内容)。每当我调用Integer.valueOf(myString)时,我都会得到异常 这个异常非常奇怪,因为如果我创建一个预定义的字符串,比如“56\n”,并使用.trim(),它就可以正常工作。但在我的代码中,不仅不是这样,而且异常文本说它不能转换的是“54856”。我尝试在那里引入一个新行,然后错误文本说它无法转换“54856” " 这是不可能的,我错过了什么 File fic

我想从一个只包含数字的txt文件中读取。这样的文件是UTF-8格式的,并且数字之间仅用新行分隔(没有空格或任何其他内容)。每当我调用Integer.valueOf(myString)时,我都会得到异常

这个异常非常奇怪,因为如果我创建一个预定义的字符串,比如“56\n”,并使用.trim(),它就可以正常工作。但在我的代码中,不仅不是这样,而且异常文本说它不能转换的是“54856”。我尝试在那里引入一个新行,然后错误文本说它无法转换“54856” " 这是不可能的,我错过了什么

File ficherentrada=新文件(“C:\\in.txt”);
FileReader entrada=新的FileReader(FicherEntrada);
BufferedReader输入=新的BufferedReader(entrada);
字符串s=input.readLine();
系统输出打印项次;
整数;
in=整数.valueOf(s.trim());
系统输出打印项次(输入);
例外案文如下:

Exception in thread "main" java.lang.NumberFormatException: For input string: "54856"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
    at java.base/java.lang.Integer.parseInt(Integer.java:658)
    at java.base/java.lang.Integer.valueOf(Integer.java:989)
    at Quicksort.main(Quicksort.java:170)
.txt中的文件包括:

54856
896
54
53
2
5634

很可能您的输入中有一个
前导/尾随空格
,类似于:

String s = " 5436";
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);
54856\n
896
54\n
53
2\n
5634
对字符串使用
trim()

UPDATE 2:
如果您的文件包含以下内容:

String s = " 5436";
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);
54856\n
896
54\n
53
2\n
5634
然后对其使用以下代码:

  ....your code
    FileReader enter = new FileReader(file);
    BufferedReader input = new BufferedReader(enter);
    String currentLine;
    while ((currentLine = input.readLine()) != null) {
    Integer in;
    //get rid of non-numbers
    in = Integer.valueOf(currentLine.replaceAll("\\D+",""));
    System.out.println(in);
    ...your code

若要确保字符串的可解析性,可以使用模式和正则表达式

Pattern intPattern = Pattern.compile("\\-?\\d+");
Matcher matcher = intPattern.matcher(input);
if (matcher.find()) {
    int value = Integer.parseInt(matcher.group(0));
    // ... do something with the result.
} else {
    // ... handle unparsable line.
}

此模式允许任何数字,也可以选择在前面加一个负号(不带空格)。它应该明确解析,除非太长。我不知道它是如何处理的,但您的示例似乎大多包含短整数,所以这不重要。

好吧,很可能它与Windows和它使用的那些\r\n有关。。。我只是试着在Linux虚拟机上执行它,结果成功了。感谢所有回答的人

尝试使用
Scanner
类读取文件,并使用它的
hasnetint()
方法来确定您正在读取的是
整数
。这将帮助您找出导致问题的字符串/字符

public static void main(String[] args) throws Exception {
    File ficheroEntrada = new File(
            "C:\\in.txt");
    Scanner scan = new Scanner(ficheroEntrada);
    while (scan.hasNext()) {
        if (scan.hasNextInt()) {
            System.out.println("found integer" + scan.nextInt());
        } else {
            System.out.println("not integer" + scan.next());
        }
    }
}

如果这在Windows下,回车符也可能在字符串中(
'\r'
)。可能是隐藏字符?尝试使用
Arrays.toString
打印字符串中的字符数组。输入的对象是什么类型的
input
?你能告诉我们你在哪里创建它吗?你能检查一下字符串中字符的序号吗?这些可能是ascii范围之外的unicode字符吗?0-9通常应该在ascii内部,但可能这些不是默认的0-9字符。我可以帮助包括打印输出,比如
System.out.println(“…”+s+”)
,奇怪的是trim没有删除
\r
是的,我指定使用trim时,错误仍然存在。这就是让我困惑的地方。你能给我们看看你的档案内容吗@查看我的更新代码Alberto,并在Windows中尝试@阿尔贝托萨罗斯