Reputation: 25
When I am trying to access map.get(c) in for loop (as shown in version 2), it returns null value and sets upper bound to be null, resulting in null-pointer exception. On the other hand, if I create end variable and assign it map.get(c) value (as shown in version 1), it works fine. So, would you please explain me why?
version 1: Works perfectly fine
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);
Version 2: Gives null-pointer exception
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);
Thanks for your help in advance! Rohan.
Upvotes: 2
Views: 60
Reputation: 29700
A for-loop runs until its condition is not met (in your case, until j <= map.get(c)
is false
). This condition is also not cached, as shown by the output of the code below:
public static void main(String[] args) {
for (int i = 0; i < getCondition(); i++) {
}
}
private static int getCondition() {
System.out.println("Test");
return 3;
}
Output:
Test
Test
Test
Test
For that reason, map.get(c)
will be called for each iteration of the for-loop. If you happen to remove the entry with key c
from map
, then the value returned from Map#get
is null
, which is what causes the NullPointerException
.
Upvotes: 1