Can not find symbol - variable calories

1

Because of this error if I am setting the calories in ifs ?

import java.util.Scanner;
public class Alimentos {
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        System.out.println("\nDigite o Alimento (Vegetariano, Peixe, Frango ou Carne): ");
        String alimento = in.nextLine();
        System.out.println("\nDigite a Bebida (Chá, Refri Diet, Suco de melancia ou Suco de Laranja): ");
        String bebida = in.nextLine();
        System.out.println("\nDigite a Sobremesa (Abacaxi, Sorvete, Sorvete Diet ou Mousse): ");
        String sobremesa = in.nextLine();
        int calorias = 350;
        int caloriasbebida = 100;
        int caloriassobremesa = 200;
    if(alimento.toLowerCase().equals("vegetariano")){
        int calorias = 180;
    } else if(alimento.toLowerCase().equals("peixe")){
        int calorias = 230;
    } else if(alimento.toLowerCase().equals("frango")){
        int calorias = 250;
    }

    if(bebida.toLowerCase().equals("chá")){
        int caloriasbebida = 20;
    } else if(bebida.toLowerCase().equals("refri diet")){
        int caloriasbebida = 65;
    } else if(bebida.toLowerCase().equals("suco de melancia")){
        int caloriasbebida = 70;
    }

    if(sobremesa.toLowerCase().equals("abacaxi")){
        int caloriassobremesa = 75;
    } else if(sobremesa.toLowerCase().equals("sorvete")){
        int caloriassobremesa = 170;
    } else if(sobremesa.toLowerCase().equals("sorvete diet")){
        int caloriassobremesa = 110;
    }
    int resultado = calorias+caloriasbebida+caloriassobremesa;
    System.out.println("Total de Calorias da Refeição: " +resultado);
}
}
    
asked by anonymous 22.03.2015 / 21:36

1 answer

4

You are declaring the variables within if so they only exist inside it, when it exits, they no longer exist. You need to learn about scope (this gives an introduction but to learn it would even be good to keep track of all the concepts in a good book).

When a variable is declared within a scope, it ceases to exist when it exits this scope. Whenever there is a block (usually delimited by { } keys) you are creating a new scope. An internal scope to another scope "inherits" the variables in the previous scope.

import java.util.Scanner;
class Alimento {
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        System.out.println("\nDigite o Alimento (Vegetariano, Peixe, Frango ou Carne): ");
        String alimento = in.nextLine();
        System.out.println("\nDigite a Bebida (Chá, Refri Diet, Suco de melancia ou Suco de Laranja): ");
        String bebida = in.nextLine();
        System.out.println("\nDigite a Sobremesa (Abacaxi, Sorvete, Sorvete Diet ou Mousse): ");
        String sobremesa = in.nextLine();
        int calorias = 350; //como tem o tipo antes da variável isto é uma declaração
        int caloriasbebida = 100; //variáveis não podem ser declaradas mais de uma vez
        int caloriassobremesa = 200; //está variável existe em todo o método
        if(alimento.toLowerCase().equals("vegetariano")) {
            calorias = 180; //a variável já foi declarada, agora só pode ser usada
        } else if(alimento.toLowerCase().equals("peixe")) {
            calorias = 230; //esta variável é a mesma declarada 6 linhas acima
        } else if(alimento.toLowerCase().equals("frango")) {
            calorias = 250; //apenas uma atribuição está sendo feita aqui
        }

        if(bebida.toLowerCase().equals("chá")) {
            caloriasbebida = 20;
        } else if(bebida.toLowerCase().equals("refri diet")) {
            caloriasbebida = 65;
        } else if(bebida.toLowerCase().equals("suco de melancia")) {
            caloriasbebida = 70;
        }

        if(sobremesa.toLowerCase().equals("abacaxi")) {
            caloriassobremesa = 75;
        } else if(sobremesa.toLowerCase().equals("sorvete")) {
            caloriassobremesa = 170;
        } else if(sobremesa.toLowerCase().equals("sorvete diet")) {
            caloriassobremesa = 110;
        }
        int resultado = calorias + caloriasbebida + caloriassobremesa;
        System.out.println("Total de Calorias da Refeição: " + resultado);
    }
}

See working on ideone .

This code still has a problem if the user does not type anything.

I optimized your original question code by initializing the calorias variable with 350, to kill all else .

I'd like to say that it would be good to organize the code in a more standardized way. This helps to understand what is happening.

    
22.03.2015 / 21:53