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











up vote
2
down vote

favorite












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.










share|improve this question






















  • Also stackoverflow.com/questions/40471/…
    – azro
    Nov 11 at 0:25















up vote
2
down vote

favorite












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.










share|improve this question






















  • Also stackoverflow.com/questions/40471/…
    – azro
    Nov 11 at 0:25













up vote
2
down vote

favorite









up vote
2
down vote

favorite











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.










share|improve this question













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.







java hashmap hashtable






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 11 at 0:14









Rohan

111




111












  • Also stackoverflow.com/questions/40471/…
    – azro
    Nov 11 at 0:25


















  • Also stackoverflow.com/questions/40471/…
    – azro
    Nov 11 at 0:25
















Also stackoverflow.com/questions/40471/…
– azro
Nov 11 at 0:25




Also stackoverflow.com/questions/40471/…
– azro
Nov 11 at 0:25












1 Answer
1






active

oldest

votes

















up vote
1
down vote













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.






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














     

    draft saved


    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53244688%2fhashmap-hashtable-not-returning-int-as-key-value-in-for-loop%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    1
    down vote













    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.






    share|improve this answer

























      up vote
      1
      down vote













      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.






      share|improve this answer























        up vote
        1
        down vote










        up vote
        1
        down vote









        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.






        share|improve this answer












        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.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 11 at 0:24









        Jacob G.

        14.7k51961




        14.7k51961






























             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53244688%2fhashmap-hashtable-not-returning-int-as-key-value-in-for-loop%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            The Sandy Post

            Danny Elfman

            Pages that link to "Head v. Amoskeag Manufacturing Co."