Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java子字符串超出范围:-1_Java_Substring - Fatal编程技术网

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

Java子字符串超出范围:-1,java,substring,Java,Substring,我是Stackoverflow的新成员,但我以前一直在这里阅读,以帮助我完成Java的第一步。我目前是一名大学生,所以目前我没有比if、loop和array更深入的知识 我目前正在做一个基金会,但最近几天我一直停滞不前。我被这个拒绝工作的子串卡住了 我觉得寻求帮助有点愚蠢,因为我相信每个人都能在2秒钟内看到这是一个错误,但我不能把我的手指放在它上面。。。无论如何,我通常不会问,但我需要在几天内交出来,所以 下面是: 输入是一个文本文件,但ligne=fichier.substring将其剪切为:

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

我目前正在做一个基金会,但最近几天我一直停滞不前。我被这个拒绝工作的子串卡住了

我觉得寻求帮助有点愚蠢,因为我相信每个人都能在2秒钟内看到这是一个错误,但我不能把我的手指放在它上面。。。无论如何,我通常不会问,但我需要在几天内交出来,所以

下面是:

输入是一个文本文件,但ligne=fichier.substring将其剪切为:
评估伽罗瓦,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。它应该将字符串从字符串的开头带到索引,它的索引为“”,但它给了我一个java.lang.StringIndexOutOfBoundsException:字符串超出范围:-1个错误,我似乎真的无法找到原因。我通常通过在线搜索找到解决问题的方法,但这次不行。我最近真的很累,所以也许这就是为什么我找不到解决这个问题的方法:P但是我真的被卡住了,所以请大家,我需要你们的帮助


感谢BigBang914

此错误是由于(“\n”)的fichier.indexOf(“\n”)返回-1。在代码的基础上,似乎要将字符串fichier分隔为行。可以使用“拆分”来执行此操作

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

你说的是这三句话:

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

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


前面几行的逻辑也有问题

  • 如果
    fichier
    根本没有换行符,前一行将抛出异常
  • 如果
    fichier
    使用不同的行分隔符序列(例如
    “\r\n”
    (Windows)或
    “\r”
    (Mac)),则可能会发生各种情况
  • 如果
    fichier
    包含多行,并且第一行没有逗号,则行修剪将删除
    indexOf(“,”
    调用找到的字符,随后的
    ligne.substring(0,indice)
    将失败
  • 这只是一个假设,因为我们不知道您的
    FabrikerSupport
    可能会遇到什么输入。然而,很明显,它得到了意想不到的输入。。。因此,让它更健壮是明智的


    更新


    事实上,上述所有内容都是有效的。我认为真正的问题是,您正在解析错误的字符串。看看
    ligne
    是如何初始化的。当然,您应该将其初始化为
    input
    。。。不是

    int indice=ligne.indexOf(“,”);这就是问题所在。该语句将在indice中返回-1。打印标记值并检查。当您尝试查找索引为-1的子字符串时,它将显示一个异常

    您确定这不是因为
    fichier.indexOf(“\n”)
    返回
    -1
    (未找到)?请记住
    BufferedReader.readLine()
    Scanner.nextLine()
    不返回换行符。是的,我确定它不是来自
    fichier.indexOf(“\n”)
    ,因为我执行了
    输出+=aligne我收到了我在代码之前粘贴的行,这正是我想要收到的。你的观点非常好,但首先:我知道越界-1意味着我的字符串中没有“,”,但我尝试了输出+=ligne,我收到了我期望的答案,我在代码前粘贴的同一行包含逗号。其次,假设它包含一个循环,当没有更多的行时它应该退出循环,但我还没有完成,我想首先解决这个问题,而不是继续处理它。第三,输入文件是由程序在受控环境中自动创建的,因此它应该总是遇到相同的格式。很抱歉,我只是在一段时间后才看到您的更新。这真的重要吗?因为我在
    ligne=fichier.substring(0,fichier.indexOf(“\n”))处初始化了它和它似乎工作良好,直到它达到
    nom=ligne.substring(0,indice)。是的,这很重要。查看
    指示器的计算方法。说真的,你在那里做的是一团混乱。即使有用,你也应该把它整理一下。谢天谢地,我没有把评论中的所有内容都给你看P我真的很擅长在编码方面把自己的生活复杂化。见鬼,我曾经用10行代码做过一个项目,我的教授用3行代码告诉我怎么做。。。不管怎样,我会试试,让你知道。它起作用了!在我告诉他林格是什么后,我初始化了他。谢谢你,我的好兄弟。就像我在顶端说的,我知道这很容易出错,但我找不到。非常感谢。我从来没用过。以前分开过,但也许明天我会试试。就像我在其他地方说过的,在我到达
    nom=ligne.substring(0,indice)之前,一切都正常工作。如果我执行
    output+=ligne,它甚至会显示该行
    ,所以我怀疑
    fichier.indexOf(“\n”)
    是我的问题;这就是问题所在。该语句将在indice中返回-1。打印标记值并检查。当你试图找到索引为-1的子字符串时,它会显示一个异常。我想我找到了它不起作用的原因。我用ligne.index初始化了indice,然后告诉他ligne是什么