在问这个问题之前,我在谷歌上花了大约半个小时,但由于我没有找到解决方案,我想我可能应该问这里。 因此,基本上我使用Java Reader来读取文本文件并将每行信息转换为一个对象,我称之为Nation(当然使用构造函数)并从所有这些对象中创建一个数组。 问题是我的文本文件中的一行变为75个字符。但我得到一个错误,告诉我长度只有68!所以这是代码的一部分,我从文件中读取信息:
static int lireRemplir (String nomFichier, Nation[] nations)
throws IOException
{
boolean existeFichier = true;
int n =0;
FileReader fr = null;
try {
fr = new FileReader(nomFichier);
}
catch (java.io.FileNotFoundException erreur) {
System.out.println("Probléme avec l'ouverture du fichier " + nomFichier);
existeFichier = false;
}
if (existeFichier) {
BufferedReader entree = new BufferedReader(fr);
boolean finFichier = false;
while (!finFichier) {
String uneLigne = entree.readLine();
if (uneLigne == null) {
finFichier=true;
}
else {
nations[n] = new Nation(uneLigne.charAt(0),uneLigne.substring(55,63),
uneLigne.substring(64,74),uneLigne.substring(1,15),uneLigne.substring(36,54));
n++;
}
}
entree.close();
}
return n;
}
我得到的错误是:
线程中的异常" main" java.lang.StringIndexOutOfBoundsException: 开始64,结束74,长度68
由于我是新来的,我试图发布我的文字图片,但我不能,所以我只是试着写一个例子:
2ETATS-UNIS WASHINGTON 9629047 291289535
4CHINE PEKIN 9596960 1273111290
3JAPON KYOTO 377835 12761000
这些单词之间有很多空格,就像一个数组!
如果我将74更改为68,当我尝试打印我的阵列时会得到一个结果,但信息丢失了。
这是我的构造函数:
public Nation(char codeContinent, String superficie, String population, String nom, String capitale) {
this.codeContinent = codeContinent;
this.superficie = superficie;
this.population = population;
this.nom = nom;
this.capitale = capitale;
}
我希望你能帮助我!如果您需要了解有关我的代码的更多信息,请告诉我们!非常感谢你。
答案 0 :(得分:1)
要避免运行时异常,您需要小心代码。如果您正在处理String或数组的索引,请检查String的长度是否大于或等于您使用的最大索引。将您抛出异常的代码包含在:
中 if(uneLigne.length() > 74) {
nations[n] = new Nation(uneLigne.charAt(0),uneLigne.substring(55,63),
uneLigne.substring(64,74),uneLigne.substring(1,15),uneLigne.substring(36,54));
} else {
//your logic to handle the line with less than 74 characters
}
即使任何行小于预期字符,这也将确保您的代码不会中断。
<强> ______________________________________________________________________________ 强>
另一种方法
添加评论作为答案:
另一种方法是使用String类的 split()方法或 StringTokenizer 类来获取数组/标记,如果该行以空格或其他方式分隔字符。有了这个,你不需要使用substring()方法来破坏字符串,你需要担心长度和可能的运行时。
使用split()方法检查下面的代码片段,对于从文件中读取的每一行,您可能必须这样做:
Nation nation = null;
String uneLigne = "2ETATS-UNIS WASHINGTON 9629047 291289535";
String[] strArray = uneLigne.split(" ");
if(strArray.length > 3) {
nation = new Nation(getContinentCodeFromFirstElement(strArray[0]), strArray[1],
strArray[2], strArray[3], strArray[4]);
}
//getContinentCodeFromFirstElement(strArray[0]) is your private method to pick the code from your first token/element.
答案 1 :(得分:-1)
解决问题的最简单方法是使用uneLigne.length更改74。 这是新代码。
nations[n] = new Nation(uneLigne.charAt(0),uneLigne.substring(55,63),
uneLigne.substring(64,uneLigne.length),uneLigne.substring(1,15),uneLigne.substring(36,54));