[Dúvida] Return, if e métodos

Olá a todos. Sou novo por aqui!

Bem, a dúvida é a seguinte:

Um método em java que não seja um [color=darkred]void[/color], termina sempre com um comando [color=darkred]return[/color] certo?

É que estou a trabalhar num programa que faz uma sequência grande de [color=darkred]if[/color], nessa sequência em cada instrução, em vez do [color=darkred]else[/color] foi sempre posto um [color=darkred]return[/color], no entanto, quando o programa é executado apresenta falhas, nomeadamente, no último [color=darkred]if[/color] em vez de fazer o [color=darkred]return[/color] do mesmo e terminar o método, continua e faz um [color=darkred]return[/color] errado.

Se alguém pudesse ajudar…

Posta um trecho do seu codigo


if (parametro > array1[ai].Metodo(parametro)){
		if (parametro > array1[ai].Metodo(parametro)){
			if (array1[ai].Metodo(parametro)){
					int ali = Metodo(array1[ai].Metodo(parametro));
					array2[ali].Metodo(array1[ai].Metodo(parametro));
					array1[ai].Metodo(parametro, parametro, parametro);
					array2[ci].Metodo(parametro);
					return 5;
			}
					
					array1[ai].Método(parametro, parametro, parametro);
					array2[ci].Metodo(parametro);
					return 5; 
		}
	return (array1[ai].Metodo(parametro)); 
}
return (array1[ai].Metodo(parametro)); 

O problema é que ele executa o que está dentro do último [color=darkred]if[/color], mas não faz o return e acaba depois por executar um dos return que está de fora return (array1[ai].Metodo(parametro)).

Como não faz o return? Pegue esse seu programa e execute-o em uma IDE qualquer (Eclipse, NetBeans). Você vai ver que ele tem de sair do seu método pelo return de qualquer jeito; provavelmente é sua condição que está errada.

Estou a utilizar o eclipse, ele faz um return, mas não é o return esperado, é um dos que já está fora da condição. Foi mesmo por estranhar que decidi postar, porque já estou há dois dias a olhar para isto, a fazer testes e não há forma de atinar com isto.

Se estás a lidar (ou a pelejar) com o Eclipse, experimenta efetuar um “refresh” no seu projecto, para que ele reconstrua o seu programa. Pode ser que estejas a tentar depurar código que não bate com os ficheiros .class que foram gerados e estão desactualizados; já tive muitos problemas com isso e sempre efetuo um “rebuild” se estou com qualquer dúvida.
Minha esposa é mais radical e, quando está a depurar programas no Eclipse, sempre efetua o “rebuild” e vai tomar um cafezinho, não importando que alteração ela efetuou.

[quote=rconde][code]

if (parametro > array1[ai].Metodo(parametro)){
if (parametro > array1[ai].Metodo(parametro)){
if (array1[ai].Metodo(parametro)){// <-- ISSO AQUI É UM BOOLEANO?
int ali = Metodo(array1[ai].Metodo(parametro));
array2[ali].Metodo(array1[ai].Metodo(parametro));
array1[ai].Metodo(parametro, parametro, parametro);
array2[ci].Metodo(parametro);
return 5;
}

				array1[ai].Método(parametro, parametro, parametro);
				array2[ci].Metodo(parametro);
				return 5; 
	}
return (array1[ai].Metodo(parametro)); 

}
return (array1[ai].Metodo(parametro));

[/code]

O problema é que ele executa o que está dentro do último [color=darkred]if[/color], mas não faz o return e acaba depois por executar um dos return que está de fora return (array1[ai].Metodo(parametro)).[/quote]

Que tipo de dados é o array1[ai].Metodo(parametro) ?

Sim, é um método booleano!

[quote=thingol]Se estás a lidar (ou a pelejar) com o Eclipse, experimenta efetuar um “refresh” no seu projecto, para que ele reconstrua o seu programa. Pode ser que estejas a tentar depurar código que não bate com os ficheiros .class que foram gerados e estão desactualizados; já tive muitos problemas com isso e sempre efetuo um “rebuild” se estou com qualquer dúvida.
Minha esposa é mais radical e, quando está a depurar programas no Eclipse, sempre efetua o “rebuild” e vai tomar um cafezinho, não importando que alteração ela efetuou.[/quote]

Como faço o rebuild?

[quote=thingol]Se estás a lidar (ou a pelejar) com o Eclipse, experimenta efetuar um “refresh” no seu projecto, para que ele reconstrua o seu programa. Pode ser que estejas a tentar depurar código que não bate com os ficheiros .class que foram gerados e estão desactualizados; já tive muitos problemas com isso e sempre efetuo um “rebuild” se estou com qualquer dúvida.
Minha esposa é mais radical e, quando está a depurar programas no Eclipse, sempre efetua o “rebuild” e vai tomar um cafezinho, não importando que alteração ela efetuou.[/quote]

Não entendi o porque do ‘pelejar’. Afinal, para que pelejar com a IDE mais usado (e a melhor, diga-se de passagem) do mercado. Mas quando ao rebuild, não é má idéia. Outra coisa, selecione todo o seu código e pressione Ctrl+I, para identar corretamente seu código e ficar mais fácil de entender qual return corresponde a determinado if.

Clique com o botão direito sobre o projeto. Selecione ‘Refresh’. Depois clique novamente com o botão direito e clique em ‘Build Project’.

if (parametro > array1[ai].Metodo(parametro)){
		if (parametro > array1[ai].Metodo(parametro)){
			if (array1[ai].Metodo(parametro)){ // <-- SE ISSO AQUI É UM BOOLEAN...
					int ali = Metodo(array1[ai].Metodo(parametro));
					array2[ali].Metodo(array1[ai].Metodo(parametro));
					array1[ai].Metodo(parametro, parametro, parametro);
					array2[ci].Metodo(parametro);
					return 5; // <-- E AQUI VC TA RETORNANDO INTEGER...
			}
					
					array1[ai].Método(parametro, parametro, parametro);
					array2[ci].Metodo(parametro);
					return 5; // <-- AQUI VC TA RETORNANDO INTEGER, TBEM...
		}
	return (array1[ai].Metodo(parametro)); // <-- MAS AQUI VC TA RETORNANDO BOOLEAN???
        }
return (array1[ai].Metodo(parametro));  // <-- E AQUI TBEM???

nao ta muito claro isso…
o retorno desse codigo q vc postou retorna boolean ou integer?
vc tem certeza que o fluxo esta entrando no terceiro if? usa um depurador pra ver a execução direitinho…

[]s

O retorno deste método é int, aquele método é booleano, está tudo certo quanto a isso.
Sei que está a sair no terceiro IF porque aqueles comandos que estão a ser executados dentro do IF estão mesmo a ser executados, só que o return que me dá é um daqueles que está em baixo, talvez seja a Main.

Não vejo rebuild nenhum, quando faço refresh e volto a carregar não tem essa opção.

EDIT: Os dois retornos que estão em baixo também são int, peço desculpa mas o método que está em cima não é o mesmo que está em baixo.

Clique com o botão direito sobre o projeto. Selecione ‘Refresh’. Depois clique novamente com o botão direito e clique em ‘Build Project’.[/quote]

Você não encontrou Build Project?

[quote=rconde]O retorno deste método é int, aquele método é booleano, está tudo certo quanto a isso.
Sei que está a sair no terceiro IF porque aqueles comandos que estão a ser executados dentro do IF estão mesmo a ser executados, só que o return que me dá é um daqueles que está em baixo, talvez seja a Main.

Não vejo rebuild nenhum, quando faço refresh e volto a carregar não tem essa opção.

EDIT: Os dois retornos que estão em baixo também são int, peço desculpa mas o método que está em cima não é o mesmo que está em baixo.[/quote]

não ta certo não… heheh Um INT é um INT um BOOLEAN é um BOOLEAN …

escolha o que vc quer retornar ^^

[quote=Lavieri][quote=rconde]O retorno deste método é int, aquele método é booleano, está tudo certo quanto a isso.
Sei que está a sair no terceiro IF porque aqueles comandos que estão a ser executados dentro do IF estão mesmo a ser executados, só que o return que me dá é um daqueles que está em baixo, talvez seja a Main.

Não vejo rebuild nenhum, quando faço refresh e volto a carregar não tem essa opção.

EDIT: Os dois retornos que estão em baixo também são int, peço desculpa mas o método que está em cima não é o mesmo que está em baixo.[/quote]

não ta certo não… heheh Um INT é um INT um BOOLEAN é um BOOLEAN …

escolha o que vc quer retornar ^^[/quote]

O método de cima é diferente do de baixo.

Não tem nenhum build project.

[quote=rconde][code]

if (parametro > array1[ai].Metodo(parametro)){
if (parametro > array1[ai].Metodo(parametro)){
if (array1[ai].Metodo(parametro)){
int ali = Metodo(array1[ai].Metodo(parametro));
array2[ali].Metodo(array1[ai].Metodo(parametro));
array1[ai].Metodo(parametro, parametro, parametro);
array2[ci].Metodo(parametro);
return 5;
}

				array1[ai].Método(parametro, parametro, parametro);
				array2[ci].Metodo(parametro);
				return 5; 
	}
return (array1[ai].Metodo(parametro)); 

}
return (array1[ai].Metodo(parametro));

[/code]

O problema é que ele executa o que está dentro do último [color=darkred]if[/color], mas não faz o return e acaba depois por executar um dos return que está de fora return (array1[ai].Metodo(parametro)).[/quote]

muitos Returns = a problema tente fazer com apenas 1 return… primeiros vamos ler seu código

[code]
if (parametro > array1[ai].Metodo(parametro)){ //temos um IF repetido
if (parametro > array1[ai].Metodo(parametro)){ //esse if repete o de cima ??? pq ??
if (array1[ai].Metodo(parametro)){ //anteriormente era um INT agora um BOOLEAN ???
int ali = Metodo(array1[ai].Metodo(parametro));
array2[ali].Metodo(array1[ai].Metodo(parametro));
array1[ai].Metodo(parametro, parametro, parametro);
array2[ci].Metodo(parametro);
return 5;
}

				array1[ai].Método(parametro, parametro, parametro);
				array2[ci].Metodo(parametro);
				return 5; 
	}
return (array1[ai].Metodo(parametro));  //isto nunca vai acontecer, pq , c entrar neste IF, vai entrar no if seguinte então nunca vai passar aqui

}
return (array1[ai].Metodo(parametro)); [/code]

me fale com clareza, array1[ai].Metodo(parametro) retorna o q ??

se retorna um boolean, pq vc faz (parametro > array1[ai].Metodo(parametro)) ?? como vc testa c algum parametro é maior que um boolean ??
eu estou tendencioso a achar que esse parametro retorna um INT …

que sendo assim não há sentido para
if (array1[ai].Metodo(parametro)){

c vc falar com clareza o que é o que no seu código, ou colar o Metodo(parametro) ai quem sabe de pra ajudar ^^

acredito que vc apenas abstraiu o nome dos metodos usando a palavra “Metodo”, ou seja, os metodos têm nomes e retornos diferentes, certo?

por apenas esse pequeno trecho, está difícil de achar o problema

pra mim, esse codigo q vc postou está muito abstraído…
de repente, se vc mandar um código mais completo, que pelo menos dê pra gente tentar executar, te dê um retorno melhor :slight_smile:

[]s

[quote=rconde][quote=Lavieri][quote=rconde]O retorno deste método é int, aquele método é booleano, está tudo certo quanto a isso.
Sei que está a sair no terceiro IF porque aqueles comandos que estão a ser executados dentro do IF estão mesmo a ser executados, só que o return que me dá é um daqueles que está em baixo, talvez seja a Main.

Não vejo rebuild nenhum, quando faço refresh e volto a carregar não tem essa opção.

EDIT: Os dois retornos que estão em baixo também são int, peço desculpa mas o método que está em cima não é o mesmo que está em baixo.[/quote]

não ta certo não… heheh Um INT é um INT um BOOLEAN é um BOOLEAN …

escolha o que vc quer retornar ^^[/quote]

O método de cima é diferente do de baixo.

Não tem nenhum build project.[/quote]

Na barra de menus Project -> Clean
Apos a limpeza ele ja faz o rebuild.

Tem alguma coisa estranha nesse array1[ai].Metodo(parametro);
Manda a assinatura dele.

[quote=sf.marcius]acredito que vc apenas abstraiu o nome dos metodos usando a palavra “Metodo”, ou seja, os metodos têm nomes e retornos diferentes, certo?

por apenas esse pequeno trecho, está difícil de achar o problema

pra mim, esse codigo q vc postou está muito abstraído…
de repente, se vc mandar um código mais completo, que pelo menos dê pra gente tentar executar, te dê um retorno melhor :slight_smile:

[]s[/quote]

pois é o que eu acredito tb, so da pra ler o q ele postou, c não vem o código dele onde ta dando problema ai fica dificil ^^

esse “Metodo” dele é muito mutante no código auhauh


if (parametro > array1[ai].MetodoINT(parametro)){  
         if (parametro > array1[ai].MetodoINT2(parametro)){ 
             if (array1[ai].MetodoBOOLEAN(parametro)){ 
                     int ali = MetodoINT3(array1[ai].MetodoINT4(parametro));  
                     array2[ali].Metodo(array1[ai].Metodo(parametro)); // Aqui são operações
                     array1[ai].Metodo(parametro, parametro, parametro); // em métodos que 
                     array2[ci].Metodo(parametro);  // não interessa
                     return 5;  
             }  
                       
                     array1[ai].Método(parametro, parametro, parametro);  //Mais operações
                     array2[ci].Metodo(parametro);  // que não interessa
                     return 5;   
         }  
     return (array1[ai].MetodoINT5(parametro));  i  
 }  
 return (array1[ai].MetodoINT6(parametro));  

Eu queria fazer só com um return, mas necessito de feedback para listar qual o erro, também já criei uma variavel onde punha o que queria de retorno lá dentro e depois retornava a variavel no fim mas também não resultou.