这里我试图阅读一个包含单词和相应缩写的文档。例如。
one,1
two,2
easy,ez
每一行都是分开的,并且用逗号将这些单词与缩写分开。
当我希望缓冲的阅读器继续使用
读取行时while ((line = br.readLine()) != null)
它赢了。它只会读取第一行。这意味着它将显示一个的缩写,即1.但如果我输入另一个值,则为2,我收到此错误消息。
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:658)
at shortener.NewClass.Short(NewClass.java:41)
at shortener.NewClass.main(NewClass.java:26)
Java Result:
这里是代码
public static String Short(String input) {
try {
FileReader fr = new FileReader("abbreviations.txt");
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
for(int i = 0; i <= line.length(); i++) {
if(line.charAt(i) == ','){
String strOrig = line.substring(0, i);
if(strOrig.equals(input)) {
String strAbv = line.substring(line.length()-1);
return strAbv;
}
}
}
}
br.close();
} catch (IOException e) {
out.println("File Not found");
}
return null;
}
答案 0 :(得分:1)
这是不正确的:
for(int i = 0; i <= line.length(); i++) {
因为访问太多了。纠正:
for(int i = 0; i < line.length(); i++) {
请注意,如果找到缩写,则发布的代码不会close()
阅读器。使用finally
阻止或try-with-resources语句来确定读者已关闭。
其他:
String.split()
可用于将行分成两个令牌,而不是显式编码分隔。 Properties
样式文件可用于存储缩写到期限地图,而不是逗号分隔文件。 Properties
类提供了一种加载文件的机制和搜索地图的方法:
// If the 'abbreviations.txt' file is not updated
// by the program then arrange for it to be loaded once.
//
try (final FileInputStream is =
new FileInputStream("abbreviations.txt"))
{
final Properties p = new Properties();
p.load(is);
return p.getProperty(input);
}
答案 1 :(得分:0)
您已将for
循环中的条件表达式设为 i小于或等于line.length()。那是错的。i
不应该等于行的长度。改变这个
for(int i = 0; i <= line.length(); i++)
到
for(int i = 0; i < line.length(); i++)
你不能使i
等于行长。索引从0
开始。因此,有效索引将从0
到length-1
答案 2 :(得分:0)
查看代码的for
循环部分:
for(int i = 0; i <= line.length(); i++) {
应该改为:
for(int i = 0; i < line.length(); i++) {
注意<=
如何更改为<
:
for(int i = 0; i <= line.length(); i++) {
//vs:
for(int i = 0; i < line.length(); i++) {
对于几乎所有编码,包括java
,计数从0开始。所以你通常会说5,在编码中你会说4。
我们假设数组的长度为3
,这意味着它包含0
,1
和2
。所以,当这样做时:
for(int i = 0; i <= line.length(); i++) {
//length of the line is 3, so:
for(int i = 0; i <= 3; i++) {
现在,它会循环抛出数字0
,1
,2
和3
。但是,该行仅包含0
,1
和2
。所以,如果我们这样做:
for(int i = 0; i < line.length(); i++) {
//length of the line is 3, so:
for(int i = 0; i < 3; i++) {
使用这个新代码,它会循环抛出0
,1
和2
,与我们的行0
,1
的长度相同,和2
。