private static String wordToFind = "one"; //word what i need find
public static void main(String[] args) throws FileNotFoundException, IOException{
int endWord = wordToFind.length(); //size word, maby this error
int startWord = 0;
String myWord = ""; // this value create word
char[] barray = new char[1024]; //byte array
try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("t.txt")))){ //read t.txt
int value;
while((value = reader.read(barray, 0, barray.length)) != -1) {
for(int i = 0; i < value; i++){
//check character
if(wordToFind.charAt(startWord) == barray[i]){
startWord++;
if(startWord > endWord){
startWord = 0;
myWord = "";
}else{
myWord += barray[i];
}
if(startWord == endWord){
System.out.println(myWord);
}
}
}
}
}catch(Exception e){
System.out.println("Error : "+e);
}
}
错误:java.lang.StringIndexOutOfBoundsException:字符串索引 范围:3
答案 0 :(得分:1)
String有一个字符数组(由其支持),该字符数组将保存&#34; one&#34;内部为value[] = {'o', 'n', 'e'}
。
数组索引从0开始直到n-1,因此您可以查询0到2之间的值。现在在您的代码中,您有:
for(int i = 0; i < value; i++) {
if(wordToFind.charAt(startWord) == barray[i]){
startWord++;
if(startWord > endWord) {
现在假设您的for循环从0到5迭代,您将尝试:
i =0//iteration 1
if(wordToFind.charAt(0) == barray[i]){
startWord++;// is now 1
if(startWord > endWord) {//1>3 no
i =1//iteration 2
if(wordToFind.charAt(1) == barray[i]){
startWord++;// is now 2
if(startWord > endWord) {//2>3 no
i =2 //iteration 3
if(wordToFind.charAt(2) == barray[i]){
startWord++;// is now 3
if(startWord > endWord) {//3>3 no
i =3
if(wordToFind.charAt(3) == barray[i]){//see you are accessing charAt(3)
startWord++;// is now 4
if(startWord > endWord) {//4>3 yes
现在对于i为3,你试图从(String)中访问第3个元素,这个数组正在String中使用(它不存在),因此你得到了异常。
所以你应该改变你的状况
if(startWord > endWord) {
要:
if(startWord >= endWord) {
答案 1 :(得分:0)
这种错误主要是通过循环来完成的。它告诉你String太大而且不适合你的数组。或者您正在尝试读取不存在的char / string。
答案 2 :(得分:0)
endWord
是您的单词的长度,但charAt(int)
是从零开始的。这意味着你可以访问的最高索引是长度 - 1.所以如果你要说
String str = "abcd";
char ch = str.charAt(str.length());
这会引发异常,因为str.length()
返回4,而索引的范围是0到3.
因此,在您的代码中,当您选中startWord > endWord
时,这应该是startWord >= endWord
。如果该检查成功,则startWord
不能再用作索引,应重置。就目前而言,代码将一直运行到startWord
等于endWord
,这意味着它太高而不能用作索引,因此会引发异常。
答案 3 :(得分:0)
从
抛出异常wordToFind.charAt(startWord)
因为startword等于wordToFind.length()。如果你看一下docs of charAt,你会发现这会引发一场惊悚。
我还删除了try catch块,以便您可以看到发生异常的位置以及整个异常堆栈跟踪。
此行将修复异常:
if(startWord&gt; = endWord){
我还修改了逻辑来打印我们找到的单词,这样就可以按照我的修改来修复异常。
这是你修改的代码:
private static String wordToFind = "mi6"; //word what i need find
public static void main(String[] args) throws FileNotFoundException, IOException {
int endWord = wordToFind.length(); //size word, maby this error
int startWord = 0;
String myWord = ""; // this value create word
char[] barray = new char[1024]; //byte array
System.out.println("searching:"+wordToFind);
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("/home/bpgergo/Workspace/mi6-REST_API/handover/README.md"))); //read t.txt
int value;
while((value = reader.read(barray, 0, barray.length)) != -1) {
for(int i = 0; i < value; i++) {
if(wordToFind.charAt(startWord) == barray[i]){
startWord++;
myWord += barray[i];
if(startWord >= endWord) {
System.out.println("Bingo:"+myWord);
startWord = 0;
myWord = "";
}
}
}
}
}