Meu código não funciona. Como usar Switch case para imprimir se a lampada está ligada ou desligada?

Meu código não funciona. Estou tentando usar um switch case para imprimir se a lampada está ligada ou desligada. Estou tentando fazer uma classe lampada onde existe um estado boleano= False, true. Onde false é para a lampada desligada e true para a lampada ligada. Mas, não funciona. Eu já testei de outros modos, ficaria feliz se alguém conseguir me mostrar o erro e assim tentar fazer uma solução melhor

Lampada.java


public class Lampada {
	private boolean ligada = true;
	
	/*
	* Métodos acessores e modificadores
	*/
	public void setLigada(boolean alteraEstado){
		if(isLigada() != alteraEstado)
			this.ligada = alteraEstado;
	}
	
	public boolean isLigada(){
		return ligada;
	}
}


Main.java


import java.util.Scanner;
public class Main {

Scanner sc = new Scanner(System.in);
String comando = sc.nextLine();
Lampada lampada = new Lampada();

public static void main(String[] args){
System.out.println("\n\n Comando 'ligar' lampada ou 'desligar' lampada.\n\n");

switch (comando){

	     
	     case "ligar":
	     if(comando.equals("ligar")){lampada.isLigada();lampada.setLigada(true); System.out.println("\n\n lampada ligada."); }
	     break;
	            	 
       	 
       	 case "desligar":
       	 if(comando.equals("ligar")){lampada.isDesligada();lampada.setLigada(false); System.out.println("\n\n lampada desligada."); }
	     break;

         }
     }
}

vc está tentando chamar variáveis não estáticas dentro de um método estático. Vc pode atribuir o static nelas:

static Scanner....

Ou fazer criar um método não estático e chama-lo dentro do public static void main

import java.util.Scanner;

public class Main {

    Scanner sc = new Scanner(System.in);
    String comando = sc.nextLine();
    Lampada lampada = new Lampada();

    private void setAcao() {
        System.out.println("\n\n Comando 'ligar' lampada ou 'desligar' lampada.\n\n");
        switch (comando) {
            case "ligar":
                if (comando.equals("ligar")) {
                    lampada.isLigada();
                    lampada.setLigada(true);
                    System.out.println("\n\n lampada ligada.");
                }
                break;

            case "desligar":
                if (comando.equals("desligar")) {
                    lampada.setLigada(false);
                    System.out.println("\n\n lampada desligada.");
                }
                break;
        }
    }

    public static void main(String[] args) {
        new Main().setAcao();
    }
}
1 curtida

Deu erro :face_with_raised_eyebrow::smiley:

Main.java:20: error: non-static variable lampada cannot be referenced from a static context if(comando.equals(“ligar”)){lampada.isDesligada();lampada.setLigada(fal
se); System.out.println("\n\n lampada desligada."); }
^

O q é esse erro?

Vc copiou e colou?

error: non-static variable lampada cannot be referenced from a static context 

ta falando que a variavel lampada nao pode ser referenciada em um contexto estático, exatamente o q eu estava te explicando acima.

Mostra como vc colou aí

1 curtida

Sim, verdade. Mas, já mudei para para o contexto estático, mas não funciona.

pq nao funciona? oq acontece? manda código, manda erro

1 curtida

Main.java:20: error: non-static variable comando cannot be referenced from a sta
tic context
if(comando.equals(“ligar”)){lampada.isDesligada();lampada.setLigada(fal
se); System.out.println("\n\n lampada desligada."); }
^
Main.java:20: error: non-static variable lampada cannot be referenced from a sta
tic context
if(comando.equals(“ligar”)){lampada.isDesligada();lampada.setLigada(fal
se); System.out.println("\n\n lampada desligada."); }
^
Main.java:20: error: cannot find symbol
if(comando.equals(“ligar”)){lampada.isDesligada();lampada.setLigada(fal
se); System.out.println("\n\n lampada desligada."); }
^
symbol: method isDesligada()
location: variable lampada of type Lampada
Main.java:20: error: non-static variable lampada cannot be referenced from a sta
tic context
if(comando.equals(“ligar”)){lampada.isDesligada();lampada.setLigada(fal
se); System.out.println("\n\n lampada desligada."); }
^
8 errors

Lampada.java


public class Lampada {
	private static boolean ligada = true;
	
	// Métodos acessores e modificadores
	
	public static  void setLigada(boolean alteraEstado){
		if(isLigada() != alteraEstado)
			this.ligada = alteraEstado;
	}
	
	public static  boolean isLigada(){
		return ligada;
	}
}


Main.java

import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
    new Main().setAcao();

    Scanner sc = new Scanner(System.in);
    String comando = sc.nextLine();
    Lampada lampada = new Lampada();

    private static void setAcao() {
    System.out.println("\n\n Comando 'ligar' lampada ou 'desligar' lampada.\n\n");
    
        switch (comando) {
            case "ligar":
                if (comando.equals("ligar")) {
                    lampada.isLigada();
                    lampada.setLigada(true);
                    System.out.println("\n\n lampada ligada.");
                }
                break;

            case "desligar":
                if (comando.equals("desligar")) {
                    lampada.setLigada(false);
                    System.out.println("\n\n lampada desligada.");
                }
                break;
        }
      }
   }
 }

é que vc colocou tudo dentro do public static void main, pode copiar e colar do jeito que eu mandei aqui.

public class Main{

    Scanner sc = new Scanner(System.in);
    String comando = sc.nextLine();
    Lampada lampada = new Lampada();

    public static void main(String[] args) {
        new Main().setAcao();
    }

    private void setAcao() {
    System.out.println("\n\n Comando 'ligar' lampada ou 'desligar' lampada.\n\n");
    
        switch (comando) {
            case "ligar":
                if (comando.equals("ligar")) {
                    lampada.isLigada();
                    lampada.setLigada(true);
                    System.out.println("\n\n lampada ligada.");
                }
                break;

            case "desligar":
                if (comando.equals("desligar")) {
                    lampada.setLigada(false);
                    System.out.println("\n\n lampada desligada.");
                }
                break;
        }
      }
 }
1 curtida

Olha isso

:face_with_raised_eyebrow:

Fiz diferente

public class Main{

Scanner sc = new Scanner(System.in);
String comando = sc.nextLine();
Lampada lampada = new Lampada();

public static void main(String[] args) {
    new Main().Resultado();
}

private void Resultado() {
System.out.println("\n\n Comando 'ligar' lampada ou 'desligar' lampada.\n\n");

    switch (comando) {
        case "ligar":
            if (comando.equals("ligar")) {
                lampada.isLigada();
                lampada.setLigada(true);
                System.out.println("\n\n lampada ligada.");
            }
            break;

        case "desligar":
            if (comando.equals("desligar")) {
                lampada.setLigada(false);
                System.out.println("\n\n lampada desligada.");
            }
            break;
    }
  }

}

Na class Lampada fiz

 public class Lampada {
private boolean ligada = true;
private boolean desligada = false;

// Métodos acessores e modificadores
public void Ligada(boolean alteraEstado){
	if(Ligada() != alteraEstado)
		this.ligada = alteraEstado;
}

public void Desligada(boolean alteraEstado){
	if(Desligada() != alteraEstado)
		this.desligada= alteraEstado;
}

public boolean Ligada(){
	return ligada;
}

public boolean Desligada(){
	return desligada;
}
 }

  public class Main{

Scanner sc = new Scanner(System.in);
String comando = sc.nextLine();
Lampada lampada = new Lampada();

public static void main(String[] args) {
    new Main().Resultado();
}

private void Resultado() {
System.out.println("\n\n Comando 'ligar' lampada ou 'desligar' lampada.\n\n");

    switch (comando) {
        case "ligar":
            if (comando.equals("ligar")) {
                // lampada.Ligada();
                lampada.setLigada(true);
                System.out.println("\n\n lampada ligada.");
            }
            break;

        case "desligar":
            if (comando.equals("desligar")) {
                lampada.setDesligada(false);
                System.out.println("\n\n lampada desligada.");
            }
            break;
    }
  }
  }

error: cannot find symbol
Scanner sc = new Scanner(System.in);
symbol: class Lampada
location: class Main
error: cannot find symbol : Lampada lampada = new Lampada();

O que significa isso?

Outros erros

:face_with_raised_eyebrow:

main.java:3: error: expected
Scanner sc = new static Scanner(System.in);
^
ain.java:3: error: ‘(’ or ‘[’ expected
Scanner sc = new static Scanner(System.in);
^
ain.java:3: error: ‘;’ expected
Scanner sc = new static Scanner(System.in);
^
ain.java:3: error: illegal start of type
Scanner sc = new static Scanner(System.in);
^
ain.java:3: error: ‘;’ expected
Scanner sc = new static Scanner(System.in);
^
ain.java:3: error: expected
Scanner sc = new static Scanner(System.in);
^

Acabei dormindo… Me deixa perguntar, pq vc não usa uma ide?

1 curtida

Não tem que mudar nada pra estático.

Adicionou complexidade desnecessária.

Veja o exemplo abaixo:

Classe Lampada:

public class Lampada {

    private boolean ligada = true;

    /*
     * Métodos acessores e modificadores
     */
    public void setLigada(boolean alteraEstado) {
        this.ligada = alteraEstado;
    }

    public boolean isLigada() {
        return ligada;
    }
}

Classe Main

import java.io.PrintStream;
import java.util.Scanner;

public class Main {

    private static final PrintStream saida = System.out;
    private static final Scanner estrada = new Scanner(System.in);

    public static void main(String[] args) {
        Main programa = new Main();
        programa.executar();
    }

    public void executar() {
        Lampada lampada = new Lampada();

        saida.println("\n\n Comando 'ligar' lampada ou 'desligar' lampada.\n\n");
        String comando = estrada.nextLine();

        switch (comando) {
            case "ligar":
                lampada.setLigada(true);
                break;

            case "desligar":
                lampada.setLigada(false);
                break;
        }

        if (lampada.isLigada()) {
            saida.println("\n\n lampada ligada.");
        } else {
            saida.println("\n\n lampada desligada.");
        }
    }
}
1 curtida

Tem muita coisa que pode ser melhorada no seu código:

  • Faça identação correta do código. Isso ajuda a entender mais rápido e é uma boa prática;
  • Não acho que a classe Lampada precise de dois atributos para representar o estado da lâmpada (ligado e desligado). Acredito que apenas um atributo resolveria;
  • Ao ligar e desligar a lâmpada, acho desnecessário esses IFs. Basta simplesmente ligar e desligar;
  • Não achei o comando que lê a entrada do usuário usando a classe Scanner;
  • No switch, dentro de cada case, é desnecessário a verificação do comando usando equals, sendo que já é tratado pelo switch.

Bom, montei um exemplo simples aqui, dê uma olhada e sinta-se a vontade para melhorá-lo:

Lampada

public class Lampada {

    private boolean ligada;

    public Lampada() {
        super();
    }
    
    public void ligar() {
        ligada = true;
    }
    
    public void desligar() {
        ligada = false;
    }

    public boolean isLigada() {
        return ligada;
    }
}

Main

public class MainLampada {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Lampada lampada = new Lampada();
        
        System.out.println("Comando 'ligar' lampada ou 'desligar' lampada:");
        String comando = scanner.nextLine();
        
        switch (comando) {
        case "ligar":
            lampada.ligar();
            System.out.println("Lâmpada ligada.");
            break;
        case "desligar":
            lampada.desligar();
            System.out.println("Lâmpada desligada.");
            break;
        }
        
        scanner.close();
    }
}
2 curtidas

Não funciona :sweat_smile:

Não funciona esse código :sweat_smile:

Creio que a IDE não ajuda muito iniciantes