当我尝试在 for 循环中访问 map.get(c) 时(如版本 2 所示),它返回空值并将上限设置为空,从而导致空指针异常。另一方面,如果我创建 end 变量并为其分配 map.get(c) 值(如版本 1 所示),它可以正常工作。那么,请你解释一下为什么?版本 1:工作得很好 int count=0; int st=0; string s = "abcabcbb"; Hashtable<Character, Integer> map = new Hashtable<Character, Integer>(); char[] str = s.toCharArray(); for(int i=0; i<str.length; i++){ char c = str[i]; if(map.get(c)==null){ map.put(c, i); if(count < map.get(c) - st + 1){ count = map.get(c) - st + 1; }; } else { int end = map.get(c); // End variable --> returns int value as expected for(int j=st; j<=end; j++){ map.remove(str[j]); st = j+1; } map.put(c,i); } } System.out.println(count);版本 2:给出空指针异常 int count=0; int st=0; string s = "abcabcbb"; Hashtable<Character, Integer> map = new Hashtable<Character, Integer>(); char[] str = s.toCharArray(); for(int i=0; i<str.length; i++){ char c = str[i]; if(map.get(c)==null){ map.put(c, i); if(count < map.get(c) - st + 1){ count = map.get(c) - st + 1; }; } else { //int end = map.get(c); // End variable commented for(int j=st; j<=map.get(c); j++){ // replaced end w map.get(c) --> returns null instead of int map.remove(str[j]); st = j+1; } map.put(c,i); } } System.out.println(count);提前感谢您的帮助!罗汉。
1 回答
白板的微信
TA贡献1883条经验 获得超3个赞
一个 for 循环运行直到它的条件不满足(在你的情况下,直到j <= map.get(c)是false)。此条件也未缓存,如下面的代码输出所示:
public static void main(String[] args) {
for (int i = 0; i < getCondition(); i++) {
}
}
private static int getCondition() {
System.out.println("Test");
return 3;
}
输出:
Test
Test
Test
Test
出于这个原因,map.get(c)将在 for 循环的每次迭代中调用。如果您碰巧从 中删除了带有键的条目,c则从map返回的值Map#get是null,这就是导致NullPointerException.
添加回答
举报
0/150
提交
取消
