为什么线程中的子字符串-异常出现运行时错误;“主要”;java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:10

为什么线程中的子字符串-异常出现运行时错误;“主要”;java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:10,java,text-parsing,Java,Text Parsing,我希望能够使用substring方法,或者如果你们有更好的建议,关于如何从包含一些信息的文本文件中获取数字,并能够将num2除以100,将num1乘以num2。我想了解一下如何正确使用substring方法 这是我到目前为止所拥有的,虽然它不是完整的代码(我已经完成了其他部分的工作),但如果有人能帮忙,我还是会很感激的。 我还使用了一个arraylist 文本示例: 1 : 4.74 (93 % pa) 2 : 1.03 (92 % pa) 3 : 2.95 (99 % pa) 4 : 5

我希望能够使用substring方法,或者如果你们有更好的建议,关于如何从包含一些信息的文本文件中获取数字,并能够将num2除以100,将num1乘以num2。我想了解一下如何正确使用substring方法

这是我到目前为止所拥有的,虽然它不是完整的代码(我已经完成了其他部分的工作),但如果有人能帮忙,我还是会很感激的。 我还使用了一个arraylist

文本示例:

1 : 4.74 (93 % pa)

2 : 1.03 (92 % pa)

3 : 2.95 (99 % pa)

4 : 5.18 (61 % pa)

5 : 5.50 (81 % pa)

6 : 3.24 (55 % pa)

7 : 3.66 (64 % pa)

8 : 3.44 (98 % pa)

9 : 2.36 (76 % pa)

10 : 1.78 (94 % pa)
编辑:数字是小数点和百分比

edit2:Duh

edit3:尝试解决此问题(如果您想更容易理解我的问题,请阅读此文)


我感觉您调用的
substring
变量错误

                String year1 = "";
                num1 = year1.substring(4,9);
                String year2 = "";
                num2 = year2.substring(10,13);
将year1设置为“”,然后尝试将num1设置为“”的子字符串

看起来您想要的是另一种方式。

a)不确定Scanner类做什么,但似乎您一次读取了两行。 while(file.hasNextLine()) { 字符串num1=file.nextLine(); 字符串num2=file.nextLine()

b) 您不应该覆盖数据:您将文本读入num1,但将空字符串(year1)的一部分分配给它,这肯定会产生索引越界异常: 字符串num1=file.nextLine(); 字符串1=“”; num1=第1年。子串(4,9)

你是说也许吧

                String num1 = file.nextLine();
                String year1 = num1.substring(4,9);
c) 为了获得更通用的方法,您应该使用java模式匹配(请参阅)


请看,答案就在那里。您需要始终检查字符串长度。似乎,当您迭代时,有一个空行,因此运行时异常会出现。分步调试器是您的朋友。我认为在您的程序中,您将year1和year2定义为空字符串,然后将num1和num2定义为其子字符串。我相信您是指其他字符串r way.@Valijon我想我没有提到它使用数组列表来存储文本文件中的数字,以及它的year1和year2?谢谢你的帮助,尽管我遇到了更多的问题,哈哈。Q_Q。NumberFormatException:对于输入字符串:“1:4.74(93%pa)”哇,谢谢,我对编程很陌生,但我不知道这一点,谢谢
                String num1 = file.nextLine();
                String year1 = num1.substring(4,9);
                Pattern p = Pattern.compile("(\\d+)\\s*\\:\\s*(\\d+\\.\\d*)\\s*\\((d+).+");
                String num1 = file.nextLine();
                String year1 = o.match(num1.trim());