在 Java 中读取文本文件时出现 CharAt 索引错误
CharAt index error while reading through text file in Java
当我遍历整个 enable1 txt 文件 (https://raw.githubusercontent.com/dolph/dictionary/master/enable1.txt) 以检查它是否符合 "I before E except after C" 英文单词 'rule' 时,我遇到了一些令人困惑的错误。当我从我在下面加星标的 charAt(indexEI - 1) 中删除“-1”时,我注意到代码成功了 (****)。
知道为什么会这样吗?错误只是在迭代的 "e" 部分看似随机的位置显示 "at java.lang.String.charAt (String.java: 658)"、"Main.ibeforeE" 和 "at Main.main"。然后它说 var\cache\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED 在最后。
我对 Java 还很陌生,因此也欢迎任何其他建设性的批评。谢谢!
主要:
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
EnableWord test = new EnableWord();
test.EnableWords();
Scanner read = new Scanner(System.in);
ArrayList<String> list = new ArrayList<String>();
list = test.getList();
int x = 0;
int falseCounter = 0;
while (x < list.size()) {
System.out.print(list.get(x) + ": ");
String input = list.get(x);
if (input.equals("x")) {
break;
} else {
System.out.println(iBeforeE(input));
if(!iBeforeE(input)) {
falseCounter++;
}
x++;
}
}
System.out.println(falseCounter);
}
public static boolean iBeforeE(String input) {
if (!input.contains("ie") && !input.contains("ei")) {
return true;
}
if (input.contains("ie")) {
int indexIE = input.indexOf("ie");
Character searchIE = input.charAt(indexIE - 1);
if (!searchIE.toString().equals("c")) {
return true;
}
} else if (input.contains("ei")) {
int indexEI = input.indexOf("ei");
****Character searchEI = input.charAt(indexEI - 1);****
if (searchEI.toString().equals("c")) {
return true;
}
}
return false;
}
Class 启用Word:
}
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class EnableWord {
private ArrayList<String> list;
private Scanner s;
private File file;
public EnableWord() {
}
public void EnableWords() {
try {
this.s = new Scanner(this.file = new File("enable1.txt"));
} catch (FileNotFoundException ex) {
Logger.getLogger(EnableWord.class.getName()).log(Level.SEVERE, null, ex);
}
this.list = new ArrayList<>();
while (s.hasNext()) {
list.add(s.next());
}
s.close();
}
public void printWords() {
for (String word : list) {
System.out.println(word);
}
}
public ArrayList<String> getList() {
ArrayList<String> newList = new ArrayList<String>();
for (String word : list) {
newList.add(word);
}
return list;
}
}
只要单词以 'ie' 或 'ei' 开头,那么 input.charAt(indexIE - 1)
就会产生错误,因为 indexIE
则为 0。
我不确定你想在你的代码中做什么,但需要某种检查
if (indexIE == 0) {
} else {
//current code
}
您的列表中有以 ei 开头的单词(例如:eicosanoid)
当你的程序到达这些单词时,它发现 'ei' 的索引为 0。因此 "indexEI - 1" 的值为负 1,无效索引。
您可以通过在尝试检查前一个字符是否为 'c':
之前检查 indexEI 是否 > 0 来修复它
if (indexEI == 0 || input.charAt(indexEI - 1).toString().equals("c")) {
return true;
}
当我遍历整个 enable1 txt 文件 (https://raw.githubusercontent.com/dolph/dictionary/master/enable1.txt) 以检查它是否符合 "I before E except after C" 英文单词 'rule' 时,我遇到了一些令人困惑的错误。当我从我在下面加星标的 charAt(indexEI - 1) 中删除“-1”时,我注意到代码成功了 (****)。
知道为什么会这样吗?错误只是在迭代的 "e" 部分看似随机的位置显示 "at java.lang.String.charAt (String.java: 658)"、"Main.ibeforeE" 和 "at Main.main"。然后它说 var\cache\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED 在最后。
我对 Java 还很陌生,因此也欢迎任何其他建设性的批评。谢谢!
主要:
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
EnableWord test = new EnableWord();
test.EnableWords();
Scanner read = new Scanner(System.in);
ArrayList<String> list = new ArrayList<String>();
list = test.getList();
int x = 0;
int falseCounter = 0;
while (x < list.size()) {
System.out.print(list.get(x) + ": ");
String input = list.get(x);
if (input.equals("x")) {
break;
} else {
System.out.println(iBeforeE(input));
if(!iBeforeE(input)) {
falseCounter++;
}
x++;
}
}
System.out.println(falseCounter);
}
public static boolean iBeforeE(String input) {
if (!input.contains("ie") && !input.contains("ei")) {
return true;
}
if (input.contains("ie")) {
int indexIE = input.indexOf("ie");
Character searchIE = input.charAt(indexIE - 1);
if (!searchIE.toString().equals("c")) {
return true;
}
} else if (input.contains("ei")) {
int indexEI = input.indexOf("ei");
****Character searchEI = input.charAt(indexEI - 1);****
if (searchEI.toString().equals("c")) {
return true;
}
}
return false;
}
Class 启用Word:
}
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class EnableWord {
private ArrayList<String> list;
private Scanner s;
private File file;
public EnableWord() {
}
public void EnableWords() {
try {
this.s = new Scanner(this.file = new File("enable1.txt"));
} catch (FileNotFoundException ex) {
Logger.getLogger(EnableWord.class.getName()).log(Level.SEVERE, null, ex);
}
this.list = new ArrayList<>();
while (s.hasNext()) {
list.add(s.next());
}
s.close();
}
public void printWords() {
for (String word : list) {
System.out.println(word);
}
}
public ArrayList<String> getList() {
ArrayList<String> newList = new ArrayList<String>();
for (String word : list) {
newList.add(word);
}
return list;
}
}
只要单词以 'ie' 或 'ei' 开头,那么 input.charAt(indexIE - 1)
就会产生错误,因为 indexIE
则为 0。
我不确定你想在你的代码中做什么,但需要某种检查
if (indexIE == 0) {
} else {
//current code
}
您的列表中有以 ei 开头的单词(例如:eicosanoid) 当你的程序到达这些单词时,它发现 'ei' 的索引为 0。因此 "indexEI - 1" 的值为负 1,无效索引。
您可以通过在尝试检查前一个字符是否为 'c':
之前检查 indexEI 是否 > 0 来修复它if (indexEI == 0 || input.charAt(indexEI - 1).toString().equals("c")) {
return true;
}