Duvida exercicio apostila Caelum

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

Esse é o codigo:

[code]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;

}
}[/code]

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:

[code]class Conta {
// … outros metodos e atributos …

     boolean saca(double valor) {
     if (this.saldo < valor) {
         return false;

}
else {
this.saldo = this.saldo - valor;
return true;
}
}
}
[/code]

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:

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:

[code]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);

}
}[/code]

[quote=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:

[code]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);

}
}[/code]

[/quote]

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.

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;   
           } 
    } 
          
} 

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.

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.

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

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?

Entendi.

Conseguir fazer funcionar agora. Valeu!