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

29 respostas
rconde

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…

29 Respostas

Mikhas

Posta um trecho do seu codigo

rconde
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)).

T

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.

rconde

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.

T

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.

Mikhas
rconde:
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));

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)).

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

rconde

Sim, é um método booleano!

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.

Como faço o rebuild?

M

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.

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.

M

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

sf.marcius
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

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.

M

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

Você não encontrou Build Project?

Lavieri

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.

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

escolha o que vc quer retornar ^^

rconde

Lavieri:
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.

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

escolha o que vc quer retornar ^^

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

Não tem nenhum build project.

Lavieri
rconde:
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)).

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

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

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 ^^

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

Mikhas

rconde:
Lavieri:
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.

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

escolha o que vc quer retornar ^^

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

Não tem nenhum build project.

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.

Lavieri

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

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

rconde
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.

Lavieri
int myReturn = -1;
if (parametro > array1[ai].MetodoINT(parametro)){  
         if (parametro > array1[ai].MetodoINT2(parametro)){
             myReturn  = 5; //ja que para os 2 casos dentro dos proximos if o return é 5
             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
             } else {  
                     array1[ai].Método(parametro, parametro, parametro);  //Mais operações
                     array2[ci].Metodo(parametro);  // que não interessa
             }
         } else { 
             myReturn = (array1[ai].MetodoINT5(parametro));
         }
 } else
         myReturn = (array1[ai].MetodoINT6(parametro));  

return myReturn

pronto 1 return apenas

Mikhas

Você poderia deixar os metodos com seus respectivos nomes. Isso ja pode ajudar a compreender oque eles estão fazendo.

Nos estamos tentando ajudar mas a maneira como você esta postando o codigo não ajuda.

Posta mais algum trecho do codigo, as classes tals.

Lavieri

ahhh apesar deu ter postado ali uma solução, esse código, pra mim, continua um lixo ^^

teria que ser quebrado em novos métodos, e repensado a logica OO dele… mais como vc nem postou o nome original dos métodos fica dificiu ^^

rconde

Este método tem 10 formas de retorno.

Não posso mostrar o código pois é um projecto para a escola e posso chumbar se alguém vir isto e me copiar.

O que acontece, ou o que me parece acontecer, é que ele executa tudo bem, mas quando chega ao último if e o executa, em vez de parar, continua e faz o return que está em baixo em vez de fazer o return de cima.
O que também aconteceu é que reparei que dependedo do input o return errado é diferente, ou seja, parece que depois de correr o método todo, volta a cima e começa a testar os if’s novamente.

Lavieri

rconde:
Este método tem 10 formas de retorno.

Não posso mostrar o código pois é um projecto para a escola e posso chumbar se alguém vir isto e me copiar.

O que acontece, ou o que me parece acontecer, é que ele executa tudo bem, mas quando chega ao último if e o executa, em vez de parar, continua e faz o return que está em baixo em vez de fazer o return de cima.
O que também aconteceu é que reparei que dependedo do input o return errado é diferente, ou seja, parece que depois de correr o método todo, volta a cima e começa a testar os if’s novamente.

sem o código, sem a solução ^^

o maximo que da pra fazer por vc ta feito, aquele código que eu postei ali em cima, faz exatamente o que vc falou que queria que fizesse aqui…

ele retorna metodoINT6 quando nada é verdade…
retorna MetodoINT5 quando parametro > MetodoINT2

e para os outros 2 casos ele retorna 5

sf.marcius

nao sei cara,

mas quanto ao medo de ter o trabalho copiado…
postando o código aqui até pode ter algum colega vivo que copie, MAS…
vc postou suas duvidas durante o processo de construção do mesmo, ainda não pronto na tentativa de o fazer, provando pra alguém que questione quem realmente é o autor do trabalho, ou seja, aquele que realmente correu atrás da solução que é vc!!! ^^

nao tenha medo…
vamo vê essas dúvidas

[]s

Poneis123

concordo… alias, vc esta mandando apenas um trecho do codigo… não esta mandando como foi implementado os metodos.

rconde

Esquecendo um código e falando apenas em teoria, é possível que uma sequência de if’s se repita automaticamente 5 vezes sem nenhum ciclo?

É que é isso que está a acontecer, sem qualquer motivo aparente a minha sequência de If’s repete 5 vezes.

Poneis123

sem que haja um ciclo nao eh possivel.
vc disse que usa o eclipse? roda este codigo em modo debug ai vc ve passo passo o q ele ta fazendo.

se tiver duvida pra rodar em modo debug diz ai

rconde

Apesar de ser estranho, não descobri o problema. Alterei a forma como estava a fazer o programa, criei mais uma class e acabei por pôr esta sequência de condições na Main.

Obrigado a todos.

Criado 7 de janeiro de 2009
Ultima resposta 8 de jan. de 2009
Respostas 29
Participantes 7