user3471438
user3471438

Reputation: 375

how to use alternative of 'goto' in Java

How can I use any alternative to 'goto' in java?

I tried using break label. But since I am not breaking out of any loop, it is giving undefined label error.

import java.io.*;

class $08_02_Total_Avg_Marks
{
    public static void main(String args[]) throws IOException
    {
        //declare and initialize variables
        int subNo = 0, totalMarks = 0;
        float avg = 0.0F;


    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   
label1:
    System.out.println("Enter no. of subjects");

    //check if input is integer
    try
    {
        subNo = Integer.parseInt(br.readLine().trim());
    }
    catch(NumberFormatException e)
    {
        System.out.println("Please enter a whole number.");
        //goto label1
    }

    int[] marksArray = new int[subNo];

    for(int i=0; i<marksArray.length; i++)
    {label2:
        System.out.println("Enter marks for subject " + (i+1));
        try
        {
            marksArray[i] = Integer.parseInt(br.readLine().trim());
        }
        catch(NumberFormatException e)
        {
            System.out.println("Please enter a whole number.");
            //goto label2
        }
    }

}
}

I was terminating the program on invalid input. But I need to execute the same lines on invalid input.

Upvotes: 0

Views: 180

Answers (4)

AlphaStream
AlphaStream

Reputation: 19

I have reformatted your code a little bit. My basic idea was: All of the goto statements can be written in equivalent loops. The first one has now been made with a while loop, which terminates ones there comes NO exception. As for the second label, that has been done with the same mechanism (so a while-loop), however, with a label that can be exited/terminated with a "break + nameOfYourLable" - statement.

import java.io.*;

class $08_02_Total_Avg_Marks
{
public static void main(String args[]) throws IOException
{
    //declare and initialize variables
    int subNo = 0, totalMarks = 0;
    float avg = 0.0F;


BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   
boolean goToLabel1 = true;
while (goToLabel1) {
System.out.println("Enter no. of subjects");

//check if input is integer
try
{
    subNo = Integer.parseInt(br.readLine().trim());
    goToLabel1 = false;  //parsing succeeded, no need to jump to label1
}
catch(NumberFormatException e)
{
    System.out.println("Please enter a whole number.");
    //goto label1
}
}
int[] marksArray = new int[subNo];

for(int i=0; i<marksArray.length; i++)
{
    label2: while (true) {
    System.out.println("Enter marks for subject " + (i+1));
    try
    {
        marksArray[i] = Integer.parseInt(br.readLine().trim());
        break label2;
    }
    catch(NumberFormatException e)
    {
        System.out.println("Please enter a whole number.");
    }
}
}

}
}

Upvotes: 1

Andy Turner
Andy Turner

Reputation: 140318

Rather than wanting to go to a specific point explicitly, wrap the bit you might want to repeat in a loop. If you don't want to execute the loop again, break.

For the first one:

while (true) {
  System.out.println("Enter no. of subjects");

  //check if input is integer
  try
  {
      subNo = Integer.parseInt(br.readLine().trim());
      break;
  }
  catch(NumberFormatException e)
  {
    System.out.println("Please enter a whole number.");
    // Nothing required to continue loop.
  }
}

For the second one, wrap the loop body in loop:

for(int i=0; i<marksArray.length; i++)
{
  while (true) {
    System.out.println("Enter marks for subject " + (i+1));
    try
    {
        marksArray[i] = Integer.parseInt(br.readLine().trim());
        break;
    }
    catch(NumberFormatException e)
    {
        System.out.println("Please enter a whole number.");
    }
  }
}

Or, probably better, write a method wrapping this loop:

int getInt(BufferedReader br) throws IOException {
  while (true) {
    try
    {
      return Integer.parseInt(br.readLine().trim());
    } catch(NumberFormatException e) {
      System.out.println("Please enter a whole number.");
    }
  }
}

and then call this method:

System.out.println("Enter no. of subjects");
int subNo = getInt(br);

for(int i=0; i<marksArray.length; i++) {
    System.out.println("Enter marks for subject " + (i+1));
    marksArray[i] = getInt(br);
}

Upvotes: 4

Alan
Alan

Reputation: 589

This code snippet will loop until a correct number is inserted, in this example (it solves your first goto problem)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
boolean noNumberEntered; //Default on false

System.out.println("Enter no. of subjects");

//TODO: check if input is integer

while(!noNumberEntered){
    try
    {
        subNo = Integer.parseInt(br.readLine().trim());
        noNumberEntered = true;

    }
    catch(NumberFormatException e)
    {
        System.out.println("Please enter a whole number.");
    }
}

Upvotes: 1

Fifi
Fifi

Reputation: 497

You can use a do while loop and a boolean instead, like that :

class $08_02_Total_Avg_Marks
{
    public static void main(String args[]) throws IOException
    {
        //declare and initialize variables
        int subNo = 0, totalMarks = 0;
        float avg = 0.0F;


    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
    boolean goodEntry = true; 
    do {
        goodEntry = true;
        System.out.println("Enter no. of subjects");

        //check if input is integer
        try
        {
            subNo = Integer.parseInt(br.readLine().trim());
        }
        catch(NumberFormatException e)
        {
            System.out.println("Please enter a whole number.");
            goodEntry = false;
        }
    } while(!goodEntry);
}

You can do the same with your second goto. There are many ways to do that (with while loop and a boolean, with breaks...), but loops are better then goto.

Upvotes: 0

Related Questions