[RESOLVIDO] - Comando else implícito

7 respostas
ECO2004

Queria tirar uma dúvida. Caso isFull() retorne true, uma exceção é lançada e o programa fecha. Caso contrário, um valor é colocado na pilha. A minha dúvida é: as linhas a partir de pilha[++altura] = e são considerados blocos else?

public void push(int e) {
		
		if(isFull())
			throw new EmptyStackException("Pilha cheia!");	
		pilha[++altura] = e;
		System.out.println("Máximo da pilha: "+size+" - Altura da pilha: "+(altura+1));
	}

7 Respostas

Rodrigo_Sasaki

Não, elas serão executadas de qualquer maneira, sendo if true ou false, o que pode ter te dado essa ilusão, é que no seu if, você lança uma exceção, terminando a execução do método.

quando se tem um if sem chaves, caso o retorno do teste seja true, será executado somente o próximo comando, após ele é retornada a execução normal.
public void metodo(int num1, int num2){

    if(num1 == num2)
        System.out.println("Só serei executado caso o o teste do if retorne true");
    System.out.println("Serei executado sempre");

}
ECO2004
digaoneves:
Não, elas serão executadas de qualquer maneira, sendo if true ou false, o que pode ter te dado essa ilusão, é que no seu if, você lança uma exceção, terminando a execução do método. quando se tem um if sem chaves, caso o retorno do teste seja true, será executado somente o próximo comando, após ele é retornada a execução normal.
public void metodo(int num1, int num2){

    if(num1 == num2)
        System.out.println("Só serei executado caso o o teste do if retorne true");
    System.out.println("Serei executado sempre");

}

Vou mostrar por que surgiu a dúvida.

public void push(int e) throws EmptyStackException{
		
		if(isFull())
			throw new EmptyStackException("Pilha cheia!");	
		pilha[++altura] = e;
		System.out.println("Máximo da pilha: "+size+" - Altura da pilha: "+(altura+1));
	}

Considerando o seguinte código na main

try{
	p.push(entrada);
}
catch(EmptyStackException e){
			
}

Se eu inserir mais de 2 elementos em minha pilha, uma exceção é lançada: EmptyStackException. Contudo, estou capturando ela. Isso quer dizer que o programa não será finalizado e continuará rodando. Bem, se o que você disse fosse verdade, o próximo comando iria colocar mais um elemento na pilha, havendo um estouro e lançaria a exceção ArrayIndexOutOfBoundsException. Entretanto, essa exceção não é lançada.

O que acontece: Quando insiro o terceiro elemento, é if é executado e retorna true. A exceção é lançada, capturada e o programa continua. As próximas linhas não são executadas e por isso, IndexOutOfBoundsException não é lançada.

Conclusão: as linhas que 05 e 06 em push são consideradas else.

ECO2004

Eu acho que escrevi besteira. Quando a exceção é tratada, o fluxo de controle muda e vai para o catch, que está na main. Dali, continua a executar os comandos que estão na main.

Por que o método não continua a ser executado?

pmlm

Quando uma excepção é lançada, ela é passada para quem chamou o método até alguém a apanhar (terminando a execução do programa senão houver qualquer catch que a apanhe).

Ao fazer o catch, trata-se a excepção e o programa continua onde a excepção foi tratada. No teu caso, o código continua no main, que é onde a excepção foi tratada.

E

Tio, você já programou em VB alguma vez na sua vida? Já ouviu falar em uma coisa bem tosca chamada “ON ERROR GOTO”?

Então, o “try / catch” equivale, mais ou menos, ao seguinte:

try {
   alguma coisa que pode dar errado
} catch (Exceção x) {
   tratamento da exceção
}
código posterior...

é algo como

ON ERROR GOTO 10
    alguma coisa que pode dar errado
    GOTO 20
10:
    tratamento da exceção
20:
    código posterior...

No começo (quando eu estava mais à vontade com GOTOs em vez de WHILEs) eu achei mais fácil essa explicação. Não sei se isso lhe confunde ou lhe ajuda.

ECO2004

Obrigado, pessoal!

Y

Entretanto, essa exceção não é lançada.

Criado 18 de junho de 2012
Ultima resposta 19 de jun. de 2012
Respostas 7
Participantes 5