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