Dan
Dan

Reputation: 7724

Unexpected return value from recursive function

I wrote a short piece of code with the purpose of setting an integer value. However, it does not seem to return the correct value. For example, for the following inputs I would expect it to work like so.

Please enter a positive integer value
-458
Please enter a positive valid integer
58
58

However, the actual output is the following.

Please enter a positive integer value
-458
Please enter a positive valid integer
58
-458

In this example why does it return -458 instead of 58?

import java.util.InputMismatchException;
import java.util.Scanner;

public class IncorectValueReturned {
    public void run() {
        System.out.println("Please enter a positive integer value");
        System.out.println(setInt());
    }

    private int setInt() {
        int i = -1;
        Scanner sc = new Scanner(System.in);
        try {
            i = sc.nextInt();
            if(i < 0) {
                System.out.println("Please enter a positive valid integer");
                setInt();
            }
        } catch(InputMismatchException iME) {
            System.out.println("Please enter a positive valid integer");
            setInt();
        }
        sc.close();
        return i;
    }

    public static void main(String[] args) {
        IncorectValueReturned iVR = new IncorectValueReturned();
        iVR.run();
    }
}

Upvotes: 0

Views: 173

Answers (2)

AxelH
AxelH

Reputation: 14572

You never change the first i that was invalid, you need to recover the value of the recursive calls

i = setInt();

And of course, you should not redeclare this Scanner over and over. Use a Instance variable instead.

Scanner sc = new Scanner(System.in);
private int setInt() {
    int i = -1;
    try {
        i = sc.nextInt();
        if(i < 0) {
            System.out.println("Please enter a positive valid integer");
            i = setInt();
        }
    } catch(InputMismatchException iME) {
        //Clear the scanner of this value
        sc.next();
        System.out.println("Please enter a positive valid integer");
        i = setInt();
    }
    return i;
}

And close the scanner when you are done with it.

Careful, a value that throws an exception will remain in the input, you need to read it, I used Scanner.next() to remove a bad input like a a value bigger than Integer.MAX_VALUE.

Upvotes: 1

Gabriel Negut
Gabriel Negut

Reputation: 13960

You didn't assign i the new value from SetInt().

if(i < 0) {
    System.out.println("Please enter a positive valid integer");
    i = setInt(); //  <- HERE
}

Upvotes: 1

Related Questions