Duvida exercicio apostila Caelum

9 respostas
G

Estou tentando fazer um exercicio aqui, mas não consigo compilar.

Esse é o codigo:

class Conta  {
	int numero;
	String dono;
	double saldo;
	double limite;
	
	boolean saca(double quantidade){
		if (this.saldo < quantidade){
		   return false;
			System.out.println("Saldo insuficiente");
} 
	else {	
	double novoSaldo = this.saldo - quantidade;
		return true;
		}
		this.saldo = novoSaldo;
		
}
	public void deposita(double quantidade){
		this.saldo += quantidade;

}
}

Esse é o erro:

Conta.java:16: cannot find symbol
symbol  : variable novoSaldo
location: class Conta
		this.saldo = novoSaldo;
		             ^
1 error

O exeplo da apostila é esse, mas eu estou tentando colocar no codigo que eu ja tinha feito:

class Conta {
         // ... outros metodos e atributos ...

         boolean saca(double valor) {
         if (this.saldo < valor) {
             return false;
}
         else {
         this.saldo = this.saldo - valor;
         return true;
}
}
}

9 Respostas

Rodrigo_Sasaki

Seguinte cara…

você criou a variável novoSaldo dentro da estrutura do if/else

e assim, quando você cria uma variável dentro dessa estrutura, assim que você sai dela, essa referência ja não existe mais

e quando você tenta atribuir novoSaldo para this.saldo essa referência já não existe, o que gera esse erro que você está tendo.

uma solução simples seria retirar direto do valor de saldo

this.saldo = this.saldo - quantidade;

obs: da próxima vez procure identar um pouco melhor o código pra ficar mais fácil pra galera entender, ok? :wink:

G

Cara, acho que entendi errado, coloquei de varias formas aqui e não deu certo, da um erro no return ou no println.
Você pode re-fazer esse meu codigo do jeito certo pra eu ver como que é? o programa é esse aqui:

class Programa {
	public static void main(String[] args){

		Conta minhaConta;
		minhaConta = new Conta();

		minhaConta.dono = "Duke";
		minhaConta.saldo = 1000.0;
		minhaConta.saca(200);
		minhaConta.deposita(500);

		System.out.println("Ola, "+minhaConta.dono+". Seu saldo atual e: "+minhaConta.saldo);
}
}
drsmachado
Guspzim:
Cara, acho que entendi errado, coloquei de varias formas aqui e não deu certo, da um erro no return ou no println. Você pode re-fazer esse meu codigo do jeito certo pra eu ver como que é? o programa é esse aqui:
class Programa {
	public static void main(String[] args){

		Conta minhaConta;
		minhaConta = new Conta();

		minhaConta.dono = "Duke";
		minhaConta.saldo = 1000.0;
		minhaConta.saca(200);
		minhaConta.deposita(500);

		System.out.println("Ola, "+minhaConta.dono+". Seu saldo atual e: "+minhaConta.saldo);
}
}

Até posso, mas isso não vai resolver teu problema.
Amigo, sugiro, urgentemente, que leia mais livros e, principalmente, preste mais atenção no que está desenvolvendo.

Declaração de variáveis é algo muito básico. Escopo de uma variável também.

Vamos lá.

Uma variável existe em um determinado escopo. Seja ele pequeno ou grande. O menor escopo de uma variável é sua declaração
Object obj;
Se ela não for instanciada e não for utilizada em nenhum outro local, ela acabou aqui. Se ela é instanciada, o segundo menor escopo é um if (ou else)
int a = -1;
if(a < 0){
int b = 0;
}
ou
int a = -1;
if(a < 0){
int b = 0;
}else{
int f = 1;
}

Assim sendo, estas variáveis acima, b e f só existem nestes escopos, a primeira no if e a segunda no else.

Elas nunca poderão ser utilizadas em nenhum outro local.

Portanto, como o digaoneves disse, você declarou a double novoSaldo dentro do escopo else e não no escopo do método.

Procure pesquisar mais, vá atrás de exemplos, recrie classes de livros (não CTRL + C / CTRL + V), faça na mão mesmo. Até ter o domínio destas condições.

Rodrigo_Sasaki

Vai ficar assim

class Conta  {   
    int numero;   
    String dono;   
    double saldo;   
    double limite;   
       
    boolean saca(double quantidade){   
           if (this.saldo < quantidade){   
                return false;   
                System.out.println("Saldo insuficiente");   
           }else{     
               // linha que eu tinha sugerido no post acima
               this.saldo = this.saldo - quantidade;   
               return true;   
           } 
    } 
          
}
drsmachado

digaoneves, desculpe, mas acho totalmente errado fazer isso.
O sujeito não conseguiu compreender a tua explicação e ela está bem, mas bem clara mesmo.
A dificuldade dele está em prestar atenção no que ele mesmo desenvolveu.
Se formos usar termos baixos para ele entender, é o mesmo que tentar comprar pão, no Brasil, com rublos. Não vai dar certo. Agora, tentar comprar pão, no Ceará com reais sacados no Rio Grande do Sul, com certeza. O escopo (país) é o mesmo, as variáveis (moeda e valor) também.

G

Bom, eu demorei pra responder porque eu fiquei tentando e consegui achar meu erro, mas obrigado mesmo assim.
Porém o programa não está sacando, apenas deposita.

E tipo, estou com a duvida exatamente por não estar só copiando e colando da apostila. Se tivesse, teria dado certo, não acha? Só se la tiver errado, mas não sei, não testei.

G

Então, “drsmachado”, a variavel novoSaldo no meu codigo só “valeria” dentro do else?

drsmachado

Exatamente.
Se você declarasse fora do if/else, mas dentro do método, ela valeria enquanto o método fosse executado (pois, mesmo que fosse passada como parâmetro, ainda assim, seria uma referência à ela).
Se a declaração fosse fora do método, mas dentro da classe, esta variável valeria enquanto houvesse uma thread executando um objeto da classe. Ela poderia ser chamada a qualquer momento neste período.

Entendeu?

G

Entendi.

Conseguir fazer funcionar agora. Valeu!

Criado 16 de maio de 2011
Ultima resposta 17 de mai. de 2011
Respostas 9
Participantes 3