Why is this piece of code looping endlessly?

Asked

Viewed 103 times

0

All variables are declared and Eclipse is pointing out no error in the entire code.

What I need to do: The user can only choose between 1, 2 and 3. Any other input, including text (example: test) and other numbers (example: 4) should accuse error (so the last JOptionPane) and resume the piece of code (hence the do-while). If the user enters the numbers 1, 2 or 3, the do-while must be broken (hence the brakes) and another question (following the same scheme) appears on the screen.

Before it was giving everything right. If the user entered with "4", the program really was error and restarted the question. Only when the user entered a text, the program closed. Probably because the opção was being transformed into int. So I thought I’d turn the opção in int only if the user had already entered the options allowed. But then began to give infinite loop.

Follows the CURRENT code (with problem):

do{
  opção=JOptionPane.showInputDialog(null, cabeçalho+inícioP1+código+espaço+"está alinhada com quantos objetivos da Estratégia da Empresa?"+digite+opção11+"2 ou mais"+opção12+"Apenas 1"+opção13+"Nenhum", cabeçalho, JOptionPane.PLAIN_MESSAGE);
    if(opção=="1" || opção=="2" || opção=="3"){
          opçãoI=Integer.parseInt(opção);
              if(opçãoI==1){
                  pontos1=pontos1+9;
                    break;
                } else if(opçãoI==2){
                    pontos1=pontos1+6;
                    break;
                } else if(opçãoI==3){
                    pontos1=pontos1+3;
                    break;
                }
            } else {
                JOptionPane.showMessageDialog(null, "Você selecionou uma opção inválida. Clique em \"OK\" para retornar.", erro, JOptionPane.PLAIN_MESSAGE);
          }
} while(opçãoI!=1 || opçãoI!=2 || opçãoI!=3);

And here’s the old code:

do{ 
            opção=JOptionPane.showInputDialog(null, "Bem-vindo ao Console de Priorização de Ideias da Nova A3 (v.1.0.0).\n\nDigite o Código ou o Nome da Ideia.", "BEM-VINDO", JOptionPane.PLAIN_MESSAGE);
            código=opção;
            do{
            opção=JOptionPane.showInputDialog(null, cabeçalho+inícioP1+código+espaço+"está alinhada com quantos objetivos da Estratégia da Empresa?"+digite+opção11+"2 ou mais"+opção12+"Apenas 1"+opção13+"Nenhum", cabeçalho, JOptionPane.PLAIN_MESSAGE);
            opçãoI=Integer.parseInt(opção);
                if(opçãoI != 0 || opçãoI == 0){
                    if(opçãoI==1){
                        pontos1=pontos1+9;
                        break;
                    } else if(opçãoI==2){
                        pontos1=pontos1+6;
                        break;
                    } else if(opçãoI==3){
                        pontos1=pontos1+3;
                        break;
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "Você selecionou uma opção inválida. Clique em \"OK\" para retornar.", erro, JOptionPane.PLAIN_MESSAGE);
                }
                JOptionPane.showMessageDialog(null, "Você selecionou uma opção inválida. Clique em \"OK\" para retornar.", erro, JOptionPane.PLAIN_MESSAGE);
            } while(opçãoI!=1 || opçãoI!=2 || opçãoI!=3);
  • I believe there are n ways to solve this. One would be to check the type of input before comparing with int, another would be to insert a jtextfield restricted to numbers only, or an easy and efficient alternative would be to use Jradiobuttons and display only the options the user has to choose from.

  • The infinite loop happens only when the user enters a text, right? Or any input value causes such a loop?

3 answers

1

The mistakes are:

String is reference, if you compare it to == it will return false unless you are talking about the same object. Ex: "1" == "1" returns false. " 1". equals("1") returns true

You don’t need to use "while...".

As you’ve put "break" inside ifs, you can do a "while(true)" that it will come out of the loop when it goes into some if.

I wiped your code... look here.

while(true) {
        opção = JOptionPane.showInputDialog(null,
                cabeçalho + inícioP1 + código + espaço
                        + "está alinhada com quantos objetivos da Estratégia da Empresa?" + digite + opção11
                        + "2 ou mais" + opção12 + "Apenas 1" + opção13 + "Nenhum",
                cabeçalho, JOptionPane.PLAIN_MESSAGE);
        if (opção.equals("1")) {
            pontos1 = pontos1 + 9;
            break;
        } else if (opção.equals("2")) {
            pontos1 = pontos1 + 6;
            break;
        } else if (opção.equals("3")) {
            pontos1 = pontos1 + 3;
            break;
        } else {
            JOptionPane.showMessageDialog(null,
                    "Você selecionou uma opção inválida. Clique em \"OK\" para retornar.", erro,
                    JOptionPane.PLAIN_MESSAGE);
        }
    }

And I leave a hint. Please do not use accents and ç in the name of variables. It gives a chill that goes up the spine here.

I hope I’ve helped.

1

Look... analyzing the condition of the loop:

valor de opcaoI | opçãoI!=1 || opçãoI!=2 || opçãoI!=3  resultado
     1                false        true         true       true
     2                true         false        true       true
     3                true         true         false      true
     4                true         true         true       true

To break the loop when opcaoI is 1, 2 or 3 the correct is && instead of ||:

valor de opcaoI | opçãoI!=1 && opçãoI!=2 && opçãoI!=3  resultado
     1                false        true         true       false
     2                true         false        true       false
     3                true         true         false      false
     4                true         true         true       true

1

all right?

Cara seems to me just a small logic error. Try to do what Gustavo suggested. Let’s see why:

When you enter the first if, it means that the user has correctly typed one of the valid options, 1, 2 or 3. That is, in your while, we have two true and one false conditions so the loop will always return to the starting point of the DO.

My suggestion is to create a control variable Boolean, to define at the end of the DO that everything went well and that the process need not repeat itself. Another option is to change the value of the option variable to a dummy value like "-1" and change the while condition by replacing "||" with "&&".

Example:`

do{
boolean controle = true;
  opção=JOptionPane.showInputDialog(null, cabeçalho+inícioP1+código+espaço+"está alinhada com quantos objetivos da Estratégia da Empresa?"+digite+opção11+"2 ou mais"+opção12+"Apenas 1"+opção13+"Nenhum", cabeçalho, JOptionPane.PLAIN_MESSAGE);
    if(opção=="1" || opção=="2" || opção=="3"){
          opçãoI=Integer.parseInt(opção);
                controle = false;
              if(opçãoI==1){
                  pontos1=pontos1+9;
                } else if(opçãoI==2){
                    pontos1=pontos1+6;
                } else if(opçãoI==3){
                    pontos1=pontos1+3;
                }
            } else {
                JOptionPane.showMessageDialog(null, "Você selecionou uma opção inválida. Clique em \"OK\" para retornar.", erro, JOptionPane.PLAIN_MESSAGE);
          }
} while(controle);

I hope I’ve helped.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.