Open In App

Infinite Loop Puzzles in Java

Improve
Improve
Like Article
Like
Save
Share
Report

Problem 1 : Insert code in the given code segments to make the loop infinite.




class GFG
{
      public static void main(String s[]){
  
           /* Insert code here */
  
           for (int i = start; i <= start + 1; i++) {
  
             /* Infinite loop */
           }
      }
}


Solution:
It looks as though it should run for only two iterations, but it can be made to loop indefinitely by taking advantage of the overflow behavior.
Integer.MAX_VALUE is the maximum value that an int can store in Java. When i gets to Integer.MAX_VALUE and is incremented, it silently wraps around to Integer.MIN_VALUE. So, we can declare variable start with 1 less than maximum value.
Following is the solution:




class GFG
{
      public static void main(String s[]){
  
           int start = Integer.MAX_VALUE-1;
           for (int i = start; i <= start + 1; i++) {
             /* Infinite loop */
           }
      }
}


In this, start=2147483645 (Integer.MAX_VALUE-1), and the value goes like 2147483645, 2147483646, -2147483648, -2147483647…….. and so on.

 

Problem 2 Insert code in the given code segments to make the loop infinite.




class GFG
{
      public static void main(String s[]) {
  
           /* Insert code here */
  
           while (i <= j && j <= i && i != j) {
  
            /* Infinite loop */
  
           }
      }
}


Solution:
Until release 5.0, Java’s numerical comparison operators (=) required both of their operands to be of a primitive numeric type (byte, char, short, int, long, float, or double). In release 5.0, the specification was changed to say that the type of each operand must be convertible to a primitive numeric type. Therein lies the rub.
In release 5.0, autoboxing and auto-unboxing were added to the language. We are using this in the following :




class GFG
{
      public static void main(String s[]){
          Integer i = new Integer(0);
          Integer j = new Integer(0);
           while (i <= j && j <= i && i != j) {
            /* Infinite loop */
           }
      }
}


The first two subexpressions (i <= j and j <= i) perform unboxing conversions on i and j and compare the resulting int values numerically. Both i and j represent 0, so both of these subexpressions evaluate to true. The third subexpression (i != j) performs an identity comparison on the object references i and j. The two variables refer to distinct objects, as each was initialized to a new Integer instance. Therefore, the third subexpression also evaluates to true, and the loop spins forever.



Last Updated : 25 Sep, 2017
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads