当我尝试在for循环中访问map.get(c)时(如版本2所示),它返回空值并将上限设置为空,从而导致空指针异常。另一方面,如果我创建结束变量并为其分配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);
谢谢您的帮助! 罗汉。
答案 0 :(得分:1)
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
因此,将为for循环的每次迭代调用map.get(c)
。如果您恰巧从c
中删除键为map
的条目,则Map#get
返回的值为null
,这就是NullPointerException
的原因。 / p>