我尝试读取.txt文件,该文件基本上是一个CSV文件,位于Android的Assets文件夹中。 在第一行中有文件的行数和列数 其余的由值组成,我使用&#34 ;;"彼此分开。
这是造成这个奇怪错误的代码:
public static int[][] getMatrix(InputStream stream) throws Exception {
BufferedReader br = new BufferedReader((new InputStreamReader(stream, "UTF-8")));
String buffer;
String[] current;
int[][] marbles = null;
//Reading the matrix from file
if((buffer = br.readLine()) != null) {
current = buffer.split(delimiter);
if(current.length !=2){
throw new Exception("File format is not respected");
}
marbles = new int[Integer.parseInt(current[0])][Integer.parseInt(current[1])];
int count = 0;
while ((buffer = br.readLine()) != null) {
current = buffer.split(delimiter);
for (int i=0;i<current.length;i++){
marbles[count][i] = Integer.parseInt(current[i]);
}
count++;
}
}
br.close();
return marbles;
}
我使用从getAssets()。open()方法获得的文件作为InputStream读取文件。
这是csv文件:
5;11
1;1;2;1;1;2;1;1;1;2;-1
1;2;1;1;2;2;1;2;2;1;-1
2;2;1;2;1;2;2;1;1;2;-1
1;1;2;1;1;1;1;2;1;2;-1
2;2;1;2;2;1;2;1;1;1;-1
我在第一行收到错误,但它清楚地表明导致它的字符串是正确的&#34; 5&#34;。
错误:
java.lang.NumberFormatException: Invalid int: "5"
这当然是由试图将字符串转换为整数的代码部分引起的。
答案 0 :(得分:4)
我的猜测是,您的文件在其文本流的开头包含BOM,这会使您的解析器感到困惑。您可以在* NIX系统上使用file
命令来验证这一点。
尝试将第一行与另一行进行交换,看看是否与另一行的第一个号码出现相同的错误。如果您设置了BOM,请点击“从utf-8中删除bom”以获取进一步的说明。
答案 1 :(得分:1)
导致此行为的唯一可能原因是文件中的不可打印符号。看看这个问题:How can I replace non-printable Unicode characters in Java?并将给定的函数应用于你的所有值,即:
marbles = new int[Integer.parseInt(current[0].replaceAll("\\p{C}", "?"))][Integer.parseInt(current[1].replaceAll("\\p{C}", "?"))]
答案 2 :(得分:0)
在我的情况下,自定义属性没有分配任何值的问题。
<FrameLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="?attr/image_visibility">
</FrameLayout>
这是自定义属性定义:
<attr name="image_visibility">
<enum name="visible" value="0"/>
<enum name="invisible" value="1"/>
<enum name="gone" value="2"/>
</attr>
问题是我没有为此自定义属性分配任何值。
删除该自定义属性或为其指定值将修复错误。