Rohan
Rohan

Reputation: 25

HashMap/Hashtable not returning int as key value in for loop

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

Answers (1)

Jacob G.
Jacob G.

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

Related Questions