为什么这段代码会报java.lang.NullPointerException

这段程序在for (int j = index; j < map.get(ch[i]) + 1; j++)会报空指针异常,为什么

import java.util.*;
class Solution {
    public static int lengthOfLongestSubstring(String s) {
        char[] ch = s.toCharArray();
        Map<Character, Integer> map = new HashMap<>();
        int index = 0;// 子串开始的角标
        int res = 0;
        for (int i = 0; i < ch.length; i++){
            if (map.containsKey(ch[i])){
                res = Math.max(res, i - index);
//                System.out.println(i);
//                System.out.println(index);
//                System.out.println(res);
                System.out.println(map.get(ch[i]));
                for (int j = index; j < map.get(ch[i]) + 1; j++){
                    map.remove(ch[j]);
                }
                index = map.get(ch[i]) + 1;

            } else {
                map.put(ch[i], i);
            }
        }
        return res;
    }

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        System.out.println(lengthOfLongestSubstring("avvab"));
    }

}

要明白DEBUG的重要性。

for (int j = index; j < map.get(ch[i]) + 1; j++)
把+1去掉

图片说明

当你执行map.remove(ch[j]) 时集合map会清除掉重复数据:"v",
在你for循环执行map.get(ch[i]) 时get不到这个"v",所以报空指针
你可以把map.get(ch[i]) 提出循环,
Integer integer = map.get(ch[i]);
这样循环就不会重复执行get方法,避免空指针.
(一般不建议在循环方法里对集合大小进行操作)

你的for循环中在调map的第i个元素时,上一次循环把第j个元素清除了,在最后一次的时候就出现了一个空指针,你可以控制一下循环次数