非常奇怪的StringIndexOutOfBoundsException

时间:2018-05-30 10:28:40

标签: java

在问这个问题之前,我在谷歌上花了大约半个小时,但由于我没有找到解决方案,我想我可能应该问这里。 因此,基本上我使用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;
}

我希望你能帮助我!如果您需要了解有关我的代码的更多信息,请告诉我们!非常感谢你。

2 个答案:

答案 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));