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

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

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

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
}

首先,在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;
}

}