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

如何在Java中使用“goto”的替代方法,java,Java,如何在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, totalMar

如何在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
        }
    }

}
}
我因输入无效而终止程序。但我需要在无效输入上执行相同的行。

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

等级$08\u 02\u总计\u平均\u分数 { 公共静态无效主字符串参数[]引发IOException { //声明和初始化变量 int subNo=0,totalMarks=0; 浮动平均值=0.0F; BufferedReader br=新的BufferedReadernew InputStreamReaderSystem.in; 布尔值goodEntry=true; 做{ goodEntry=true; System.out.Printl输入受试者编号; //检查输入是否为整数 尝试 { subNo=Integer.parseIntbr.readLine.trim; } CatchNumberFormatExe { System.out.println请输入一个整数。; goodEntry=false; } }好啦!好啦; } 你可以用你的第二个goto做同样的事情。
有很多方法可以使用while循环和布尔值,带中断…,但循环比goto更好。

与其显式地转到特定点,不如将可能要在循环中重复的位包装起来。如果不想再次执行循环,请中断

对于第一个:

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.");
    }
  }
}
然后调用此方法:

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

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

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

我已经重新格式化了你的代码。我的基本想法是:所有的goto语句都可以写在等效的循环中。第一个现在是用一个while循环来完成的,它终止了一个循环,没有例外。至于第二个标签,它是用相同的机制完成的,所以while循环可以是exited/以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.");
    }
}
}

}
}

goto在Java中。但是,只有在迭代构造中才能使用,例如do/while、for、for each和while循环。@Avi,您可以分解大多数标记块,而不仅仅是循环。这里有一些示例:在面向对象编程中使用goto标签?这实际上与一个好主意相反…@deHaar,为什么?OOP仍然使用过程来处理事件,并且在所述过程的实现中没有严格的中断规则。关于goto,我所知道的唯一一件可能不是好主意的事情是当您在不同的过程中随机访问某个位置。另外,您不同意方法调用也只是一个花哨的goto吗?@user3471438,是got的合适替代方案Java中的o是一个方法调用。您已经可以知道提取到方法中的内容,因为您已经有了label和goto label。您只需要这样做。这是一个非常简单但有效的解决方案。!!非常感谢。。!!
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.");
    }
}
}

}
}