为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Java中使用'goto'的替代方法

如何在Java中使用'goto'的替代方法

回首忆惘然 2023-05-17 15:52:36
我怎样才能在 Java 中使用任何替代“goto”的方法?我尝试使用中断标签。但是由于我没有跳出任何循环,所以它给出了未定义的标签错误。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        }    }}}我正在终止无效输入的程序。但是我需要在无效输入上执行相同的行。
查看完整描述

4 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

与其明确地转到特定点,不如将您可能想要在循环中重复的位包装起来。如果您不想再次执行循环,break.


对于第一个:


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(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.");

    }

  }

}

或者,写一个包装这个循环的方法可能更好:


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.");

    }

  }

}

然后调用此方法:


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);

}


查看完整回答
反对 回复 2023-05-17
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

我已经稍微重新格式化了您的代码。我的基本想法是:所有的 goto 语句都可以写成等价的循环。第一个现在是用一个 while 循环制作的,它终止了一个没有例外。至于第二个标签,它是用相同的机制完成的(所以是一个 while 循环),但是,标签可以用“break + nameOfYourLable” - 语句退出/终止。


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.");

    }

}

}


}

}


查看完整回答
反对 回复 2023-05-17
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

此代码片段将循环直到插入正确的数字,在本例中(它解决了您的第一个 goto 问题)


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.");

    }

}


查看完整回答
反对 回复 2023-05-17
?
翻阅古今

TA贡献1780条经验 获得超5个赞

您可以改用do while循环和布尔值,如下所示:


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);

}

你可以对你的第二个做同样的事情goto。有很多方法可以做到这一点(使用while循环和布尔值,使用breaks...),但循环比goto.


查看完整回答
反对 回复 2023-05-17
  • 4 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信