Java子字符串超出范围:-1

时间:2016-10-29 00:55:29

标签: java substring

我是Stackoverflow的新成员,但我之前一直在这里阅读,以帮助我完成Java的第一步。我现在是大学生,所以我现在没有比if,loop和array更深入的知识了。

我目前正在努力,但过去几天我一直停滞不前。我坚持使用这个拒绝工作的子串。

我觉得有点愚蠢的寻求帮助,因为我确定这是一个错误,每个人都可以在2秒钟内看到但是我不能把它放在手指上......无论如何我通常不会问,但我需要手它过了几天......

在这里:

输入是一个texte文件,但是ligne = fichier.substring将其剪切为:
Evariste Galois,3,7.5,8.5,10.0,5.5,2.5,0.0,3.4

private static String fabriquerRapport(String input) 

{
    String output = input;
    double tauxHoraire = 15.65;
    double tauxAugmentation = 0.015;

    String nom = "";
    int ancien = 0;
    double lundi = 0;
    double mardi = 0;
    double mercredi = 0;
    double jeudi = 0;
    double vendredi = 0;
    double samedi = 0;
    double dimanche = 0;
    String ligne = "";
    String fichier = output;
    String chaine = "";
    int indice = ligne.indexOf(",");

    double reg = 0;
    double supp = 0;
    double total = 0;

    java.util.Calendar c = java.util.Calendar.getInstance();
    String date = String.format("%1$tY-%1$tm-%1$te %1$tH:%1$tM",c);

    output  = "================================================================================================\n" ;
    output += "RGT Media : Rapport de charge salariale                           Comptable : XXXXXXXXXXXXXXX\n" ;
    output += "Date      : " + date +"\n";
    output += "================================================================================================\n" ;
    output += "                           A   L    M    M    J    V    S    D       Reg.      Supp.    Salaire \n" ;
    output += "================================================================================================\n" ;

    ligne = fichier.substring(0 , fichier.indexOf("\n"));
    nom = ligne.substring(0,indice);
    if(nom.length()>27) nom = nom.substring(0, 23) + "...";
    ligne = ligne.substring(indice+1);
    output += nom;

    return output;
}

不介意未使用的变量,还有更多,但我为这篇文章删除了很多,因为大多数是在评论中,因为我在这里被阻止了。抱歉,变量是法语的,但我想你仍然能够理解他们在做什么。

问题是nom的ligne.substring。它应该从字符串的开头到String的indice是indexOf“,”但它给了我一个java.lang.StringIndexOutOfBoundsException:字符串超出范围:-1错误我真的似乎无法找到为什么。我通常通过在线搜索找到解决问题的方法,但不是这次。我最近一直很累,所以也许这就是为什么我找不到解决方案:P但是我真的被困住了所以请大家好,我需要你的帮助!

感谢TheBigBang914

3 个答案:

答案 0 :(得分:2)

你在谈论这三条线:

int indice = ligne.indexOf(",");
...
ligne = fichier.substring(0 , fichier.indexOf("\n"));
nom = ligne.substring(0,indice);   // exception here (you say)

如果你得到:

java.lang.StringIndexOutOfBoundsException: String out of range: -1

它清楚地告诉您,您正在使用-1作为其中一个界限。显然,第一个边界为零,但您使用indexOf的结果作为第二个边界。如果indexOf找不到所需的字符串,则会返回-1

因此问题的原因是一行不包含","

前一行的逻辑也存在问题。

  1. 如果fichier根本没有换行符,则前一行会抛出异常。
  2. 如果fichier使用不同的行分隔符序列(例如"\r\n"(Windows)或"\r"(Mac)),则可能会发生各种各样的事情。
  3. 如果fichier包含多行,并且第一行不是逗号,则行修剪将删除indexOf(",")调用找到的字符,后续ligne.substring(0, indice)将失败
  4. 这有点假设,因为我们不知道您的fabriquerRapport可能会遇到什么输入。但是,很明显它会得到意想不到的输入......因此建议使其更加健壮。

    <强>更新

    实际上,虽然以上所有都是有效的。我认为真正的问题是,你正在解析错误的字符串。看看如何初始化ligne。当然,您应该将其初始化为input ...而不是"" !!!

答案 1 :(得分:0)

错误是因为fichier.indexOf("\n")这会返回-1。根据代码看起来你想要将字符串fichier分成行。您可以使用拆分来执行此操作。

String[] lines = string.split(System.getProperty("line.separator")); 

答案 2 :(得分:0)

int indice = ligne.indexOf(&#34;,&#34;);是问题。该声明将在指数中返回-1。打印indice的值并检查。当您尝试查找索引为-1的子字符串时,它将显示异常。