使用之前向我建议的内容,我尝试使用Path和stream以下列方式读取文件:
Path p= Paths.get(file);
try (Stream<String> lines = Files.lines(p, StandardCharsets.UTF_8)) { // 1
lines.map(line -> line.split(";")) // 2
.forEach(lineAsArray -> {
if (lineAsArray[0].equals("E")) {
creaEditore(lineAsArray[2], Integer.parseInt(lineAsArray[3]), lineAsArray[4]);
}
else if (lineAsArray[0].equals("L")) {
Libro tmp = null;
try {
tmp = creaLibro(lineAsArray[1], lineAsArray[2], Integer.parseInt(lineAsArray[3]), Double.parseDouble(lineAsArray[4]), lineAsArray[5]);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (EditoreInesistente e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tmp.setQuantita(Integer.parseInt(lineAsArray[6]));
}
});
}
catch (IOException io)
{
System.out.println("Wrong reading");
}
每一行在开头都包含一个与我想要创建的对象相对应的字母(&#34; Editore&#34;或者&#34; Libro&#34;)以及以下字段包含的值其属性(所有字段由半列分隔)。但是,在执行时,我会收到以下异常和错误:
Exception in thread "main" java.lang.NumberFormatException: For input string: "cheih@gja.it"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at libreria.Libreria.lambda$4(Libreria.java:122)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
at java.util.Iterator.forEachRemaining(Unknown Source)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.ReferencePipeline.forEach(Unknown Source)
at libreria.Libreria.leggi(Libreria.java:120)
at Esempio.main(Esempio.java:20)
调试我发现在读取第一行时一切都完美正常,但程序无法解析它并使用lineAsArray []获取每个字段。有人能帮我吗?该程序的要求还要求不考虑具有错误sintax的行,我的代码会自动执行类似的操作吗?
这是我文件的sintax:
先谢谢你的帮助, 詹卢卡。
答案 0 :(得分:1)
我认为你在第一部分做了一点误会。 E.g。
if (lineAsArray[0].equals("E")) {
creaEditore(lineAsArray[2], Integer.parseInt(lineAsArray[3]), lineAsArray[4]);
}
注意你是如何跳过索引&#39; 0&#39; (在if语句中)索引&#39; 2&#39; (在&#34; creaEditore&#34;的第一个参数中)。如果它不会在&#34; parseInt&#34;中抱怨错误的参数。方法,这将抛出IndexOutOfBoundException,因为数组索引从0开始而不是1。
答案 1 :(得分:0)
如果您的案例是E,则您的代码正在关注
if (lineAsArray[0].equals("E")) {
creaEditore(lineAsArray[2], Integer.parseInt(lineAsArray[3]), lineAsArray[4]);
}
您正在尝试将 lineAsArray [3]的值转换为Int 。 在这种情况下,索引3处的值为“ cheih@gja.it ”,无法转换为int。这就是你得到这个例外的原因