Quebrando a cabeça (iniciante)

[size=12]Boa noite.

Sou novo no forum, e ja no primeiro dia começarei a incomodar, hehe. Mas vamos la.

Fazem duas semanas que estou aprendendo a programar em Java com o “Como programar em Java”, e nunca tinha programado antes. Então, por favor, paciencia, rsrs.

Enrolações à parte, minha dúvida é a seguinte: acabei de fazer um aplicativo para conversão de valores de moedas (nesse caso, euro ou dolar para real), usando duas classes para o calculo da conversão (uma para cada moeda), e a classe principal do aplicativo.

Usei if em todas as instruções, mas rolou um probleminha aqui: logo no começo do código, declarei uma variável “value” do tipo double, e o compilador nao está aceitando a inicialização dela na atribuição do valor digitado pelo usuário… Estou tendo que inicializar essa variável ja na criação da mesma.

A minha dúvida é: Java não deixa inicializar a variável porque ela está dentro de um if?

Se for necessário, posto o codigo desse aplicativo para vocês darem uma analisada.

Valew[/size]

Bem vindo ao mundo java e ao GUJ!

Seu código é como esse?

double a;
if(/*condição*/){
    a = 15.9;
}

System.out.println(a); // nessa linha ta dando erro que a variável não foi inicializada?

se for, isso é devido ao compilador não ter como afirmar se ela já foi inicializada ou não.
se não for isso posta o código para podermos conferir.

Até!

Segue o código abaixo:

[code]
Scanner input = new Scanner( System.in );
RatingDollar myRatingDollar = new RatingDollar( 2.50 , 0.00 );
RatingEuro myRatingEuro = new RatingEuro( 3.00 , 0 );

  int ratDollar = 1;
  int ratEuro = 2;
  int option;
  double value;

  System.out.print( "\nBEM VINDO AO RATING MONEY SYSTEM!!!\n\n\n" );


  System.out.print( "Digite a opção de cotação, segundo as opcoes abaixo:\nDollar: 1\nEuro: 2\nOpcao numero: " );
  option = input.nextInt();

  System.out.print( "\n\n" );


  if ( option == ratDollar )
     System.out.println( "Opcao escolhida: DOLLAR!" );


  if ( option == ratDollar )
     System.out.printf( "Quantia de Dolares a serem convertidos em Reais: U$" );

  if ( option == ratDollar )
     value = input.nextDouble();

  if ( option == ratDollar )
     myRatingDollar.setRatingDollar( value );

  if ( option == ratDollar )
     System.out.printf( "\nU$%.2f equivalem a R$%.2f!\n\n",
                          value, myRatingDollar.getRatingDollar() );



  if ( option == ratEuro )
     System.out.println( "Opcao escolhida: EURO!" );

  if ( option == ratEuro )
     System.out.print( "Quantia de Euros a serem convertidos em reais: E$" );

  if ( option == ratEuro )
     value = input.nextDouble();

  if ( option == ratEuro )
     myRatingEuro.setRatingEuro( value );

  if ( option == ratEuro )
     System.out.printf( "\nE$%.2f equivalem a R$%.2f!\n\n",
                         value, myRatingEuro.getRatingEuro() );[/code]

Consegui fazer com que executasse apenas quando inicializo a variável value com valor “0”, no momento em que crio a mesma. Se não faço isso, o compilador acusa que a variável nao foi inicializada.

Mas todos os aplicativos que fiz até agora aceitavam a inicialização da variável no momento em que eu joagav o método “nextDouble()” ou outros.

Existe uma explicação pra isso?

Bom… Desculpem o incomodo mesmo.

Valew

Oi,

Amigo posso falar besteira agora,mas se vc for querer explicação para tudo,vai ficar louco,digo muiiitoooo louco,sempre inicializei minhas variaveis… :roll:

Liga não…hoje não estou bem… :shock:

É como eu te disse, como o compilador vai saber que nesse trecho a variável value esta inicializada

if ( option == ratDollar ) System.out.printf( "\nU$%.2f equivalem a R$%.2f!\n\n", value, myRatingDollar.getRatingDollar() );

já que nada garante que a segunda linha desse trecho foi executada

if ( option == ratDollar ) value = input.nextDouble();

mas uma pergunta você sabe oque é bloco?

pois olha como poderia ficar seu código

Scanner input = new Scanner( System.in );  
RatingDollar myRatingDollar = new RatingDollar( 2.50 , 0.00 );  
RatingEuro myRatingEuro = new RatingEuro( 3.00 , 0 );  
  
int ratDollar = 1;  
int ratEuro = 2;  
int option;  
double value;  
  
System.out.print( "\nBEM VINDO AO RATING MONEY SYSTEM!!!\n\n\n" );  
  
  
System.out.print( "Digite a opção de cotação, segundo as opcoes abaixo:\nDollar: 1\nEuro: 2\nOpcao numero: " );  
option = input.nextInt();  
  
System.out.print( "\n\n" );  
  
  
if ( option == ratDollar ){  
   System.out.println( "Opcao escolhida: DOLLAR!" );  
   System.out.printf( "Quantia de Dolares a serem convertidos em Reais: U$" );  
   value = input.nextDouble();  
   myRatingDollar.setRatingDollar( value );  
   System.out.printf( "\nU$%.2f equivalem a R$%.2f!\n\n",  
                        value, myRatingDollar.getRatingDollar() );  
} else if ( option == ratEuro ) {  
   System.out.println( "Opcao escolhida: EURO!" );  
   System.out.print( "Quantia de Euros a serem convertidos em reais: E$" );   
   value = input.nextDouble();  
   myRatingEuro.setRatingEuro( value );   
   System.out.printf( "\nE$%.2f equivalem a R$%.2f!\n\n",  
                       value, myRatingEuro.getRatingEuro() );
} else {
   System.out.println("Opção invalida");
}

notou a diferença???

lembrando que assim não é necessário inicializar value com 0 pois pra chegar nessa linha

System.out.printf( "\nU$%.2f equivalem a R$%.2f!\n\n", value, myRatingDollar.getRatingDollar() ); obrigatoriamente essa linha já teria sido executada

   value = input.nextDouble();  

apos um if tudo que estiver entre chaves ({ e }) sera executado quando a condição retornar verdadeiro o código entre chaves é chamado de bloco

e a síntese

if(condição1) { ... } else if(condição2) { ... ... } else if(condiçãon) { ... } else { ... }

pode ser lida como se não for conição1 verifica se é condição2 … se não for verifica se é condiçãon se não for nenhuma executa o else

Aconselho você a estudar e até a próxima!

Rsrsrsrs… é, acho q tenho q aprender a relaxar um poko, rsrs.

Tipo , analisando a resposta do InseOfKn, tem lógica…

Mas aí eu pergunto, se o compilador não inicializa a variável que ta dentro da estrutura condicional porque ela não tem como ter certeza que a mesma foi inicializada, quando chamo a mesma variável para dentro do método set, também não deveria rolar, afinal essa chamada também está dentro de uma estrutura condicional. E essa chamada do método set funcionou quando fiz um teste tirando a estrutura if da linha da inicialização da variavel com nextDouble()., mesmo nao tendo inicializado la em cima…

Ou seja… Acho que eu sou é muito novato em programação pra ficar querendo explicação pra qualquer tipo de errinho que aparecer, né?? kkkkkk…

De qualquer jeito, desculpa mesmo galera… Até o amadorismo desaparecer em mim, vai loooonge…

Hum… valew, cara…

Agora entendi…

Tipo. Não cheguei ainda no capitulo que ensina a usar if - else, e onde eu estou no livro ainda nao tinha aparecido que da pra fazer estrutura de bloco dentro da estrutura if.

O jeito é estudar cada vez mais.

Valew aí, ajudou pra caramba.

Imagina assim

...
int a;
if(b==0){
   a = 1;
}

...

if(b==0){
   System.out.println(a);
}

agora o compilador ta la compilando e quando chega na linha

System.out.println(a);

ele se pergunta a variável a tem valor???
é pode ter ou não já que ela ta em um if que pode ser executado ou não
já que eu não tenho certeza vou dizer que ta errado

dai tu pode pensar mas báh como o compilador não tem certeza já que a condição dos if é a mesma

dai eu respondo

vá que entre um if e o outro o valor de b tenha mudado e entrado só no segundo e não no primeiro que valor que o System.out.print imprimiria??

imprimiria o valor atual de a, que pod não ser 1 ( ou até dra erro por em nenhum momento ter sido inicializado )… é isso??

Se for, acho q entendi…

No caso do meu codigo, por mais que o envio do valor da variável para o metodo “set” seja condicional, podendo ocorrer ou não, o compilador espera que ela ja tenha sido inicializada…

Mas, no caso da inicialização da variável, como não existe a garantia de que ocorrerá o evento que ativará a inicialização, o compilador “prefere” considerar que poderá nao ocorrer a mesma, e da o erro…

É isso??

Bom, vou tentar matutar um poko mais daqui em diante antes de postar minhas duvidas, senão vcs nao terao mais paz pelos proximos seis meses, hehe…

Valewzão pela ajuda mesmo…

é isso mesmo, o compilador acha o problema de uma variável não esta inicializada tão grave que na duvida prefere não deixar nem mesmo compilar.

Mas métodos não são estruturas condicionais, imagino que o seu set tinha parâmetros e que quando você fez o teste com ele você declarou a variável fora de qualquer método (incluindo o método main) e quando isso acontece (declarado na class se for estático é chamado de variável de class, se não é chamado de atributo) o java já inicializa eles com um valor default a baixo vai os valor defaults pra cada tipo

boolean :arrow: false
byte :arrow: 0
int :arrow: 0
long :arrow: 0
float :arrow: 0.0
double :arrow: 0.0
char :arrow: não lembro
String assim como qualquer objeto :arrow: null

isso mesmo pesquisa é tudo que é lugar, olha a documentação e se mesmo assim não obter resposta pergunta que taremos sempre aqui pra ajudar

mas gostei da tua pergunta, mostrou que não não tais interessado só em fazer funcionar e também em como funciona, isso é bom, muito bom continue assim que em poucos meses quem vai ta ajudando aqui é você!

Até!