Why this piece of code is looping infinite?

0

All variables are declared and Eclipse is not pointing any errors in the whole code.

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

Before, I was giving everything right. If the user entered "4", the program actually reported error and restarted the question. But when the user entered with a text, the program closed. Probably because opção was being transformed into int . Then I thought about turning opção to int only if the user had already entered with the allowed options. But then it started to loop endlessly.

Here is 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);
    
asked by anonymous 19.05.2017 / 04:13

3 answers

1

Look carefully ... 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 I option 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
    
19.05.2017 / 05:20
1

Alright?

Dude, it just seems like a little logic bug. Try to do what Gustavo suggested. Let's see why:

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

My suggestion is to create a boolean control variable, to define at the end of the DO that everything went well and that the process does not have to be repeated. Another option is to change the value of the option variable I to a dummy value like "-1" and change the condition of while replacing the "||" by "& &".

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 have helped.

    
19.05.2017 / 05:53
1

The errors are:

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

You do not need to use "do ... while".

As you put "break" inside the ifs, you can do a "while (true)" as it will exit the loop when entering some if.

I gave you a wipe in your code ... look there.

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 tip. Please do not use accents and ç in the variable name. This gives a chill up the spine here.

I hope I have helped.

    
25.05.2017 / 00:12