2 m0 38110604 m0_38110604 于 2017.09.13 23:30 提问

java实现BF算法求一个字符串在另一个字符串中的位置出现空指针异常:

import java.util.Scanner;
//这是我的代码
public class Demo8 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
String str1 = s.nextLine();
System.out.println("请输入第二个字符串:");
String str2 = s.nextLine();
System.out.println("请输入两个字符串:");
int index = find(str1,str2);
System.out.println("str2在str1中的位置为:"+index);
}
public static int find(String str1,String str2){//接收两个字符串
int index = 0;//主串从下标0开始第一趟匹配
int i = 0,j = 0;设置比较的起始下标
char[] arr1 = str1.toCharArray();//转换成字符数组
char[] arr2 = str2.toCharArray();
while(arr1[i]!='\0' && arr2[j]!='\0'){
if(arr1[i]==arr2[j]){
i++;
j++;
}else{
index++;
i = index;//i,j分别回溯
j = 0;
}
}
if(arr2[j]=='\0'){
return index+1;//返回本趟匹配的开始位置(不是下标)
}
return -1;
}
}
高手请帮我看一下!ArrayIndexOutOfBoundsException

4个回答

jdz199409
jdz199409   2017.09.14 09:53
已采纳

这不是C语言,!='\0'在Java中是不规范的~

m0_38110604
m0_38110604 嗯嗯 就是这个问题
14 天之前 回复
qq_28173395
qq_28173395   2017.09.14 23:54

首先,在Java里面判断数组是不是到了最后一个没有用”!='\0”这个来判断的,你可以直接判断(i < arr1.length && j < arr2.length),java里没有结束符,所以才会产生越界。
你可以试试这个代码
public class Demo8 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
String str1 = s.nextLine();
System.out.println("请输入第二个字符串:");
String str2 = s.nextLine();
System.out.println("请输入两个字符串:");
int index = find(str1, str2);
System.out.println("str2在str1中的位置为:" + index);
}

public static int find(String str1, String str2) {// 接收两个字符串
    int index = 0;// 主串从下标0开始第一趟匹配
    int i = 0, j = 0;// 设置比较的起始下标
    char[] arr1 = str1.toCharArray();// 转换成字符数组
    char[] arr2 = str2.toCharArray();
    while (i < arr1.length && j < arr2.length) {
        if (arr1[i] == arr2[j]) {
            i++;
            j++;
        } else {
            index++;
            i = index;// i,j分别回溯
            j = 0;
        }
    }
    if (j != 0 && j == arr2.length) {
        return i - j;// 返回本趟匹配的开始位置(不是下标)
    }
    return -1;
}

}

m0_38110604
m0_38110604 对,你说的是对的。
14 天之前 回复
jdz199409
jdz199409   2017.09.14 09:51

兄弟,你是不是没判断arr1[i]与arr2[j] 中 i 与 j 的范围是 0 <= i < arr1.length ; 0 <= j < arr2.length

m0_38110604
m0_38110604 Java与C语言判断数组结束的标志不一样
14 天之前 回复
out_of_it_farmer
out_of_it_farmer   2017.09.14 10:04
while(arr1[i]!='\0' && arr2[j]!='\0'){
if(arr1[i]==arr2[j]){
i++;
j++;
}else{
index++;
i = index;//i,j分别回溯
j = 0;
}
}

这段代码,if判断为true时,i++,j++,然后循环到while判断时,length较小的数组会ArrayIndexOutOfBoundsException;比如:

int[] arr1=[1,2,3]; int[] arr2=[1];
if(arr1[0]==arr2[0]){
i++;
j++; // 这会导致上面的while判断出现arr2[1]!='\0'; throw ArrayIndexOutOfBoundsException
}

m0_38110604
m0_38110604 两种需要判断数组结束不一样
14 天之前 回复
Csdn user default icon
上传中...
上传图片
插入图片