Como esse while para?

8 respostas
sk2ck

gente estou seguindo o livro dos caras da Deitel, e estou achando uma parte do livro meio dificil de se entender. Tem um exemplo deles que uma parte do código é essa:

public void openFile()
	{
		try
		{
			input = new ObjectInputStream(new FileInputStream("clients.ser"));
		}
		catch(IOException ioException)
		{
			System.err.println("Erro ao abrir arquivo.");
		}
	}
	
	// lê o registro no arquivo
	public void readRecords()
	{
		AccountRecordSerializable record;
		System.out.printf("%-10s%-12s%-12s%10s\n", "Account",
				"First Name", "Last Name", "Balance");
		
		try
		{
			while(true)
			{
				record = (AccountRecordSerializable) input.readObject(); // realiza um downcast
				// coerção dos dados
				
				// exibe o conteúdo de registro
				System.out.printf("%-10d%-12s%-12s%10.2f\n",
						record.getAccount(), record.getFirstName(),
						record.getLastName(), record.getBalance());
			}
		}
		catch(EOFException endOfFileException)
		{
			return; // fim do arquivo foi alcançado
		}
		catch(ClassNotFoundException classNoFoundException)
		{
			System.err.println("Unable em criar objeto.");
		}
		catch(IOException ioException)
		{
			System.err.println("Erro durante leitura do arquivo.");
		}
	}

A minha pergunta é: como o while(true) para?? eu não vejo nada que venha fazer a condição ficar false!!! e também não há breaks… extranho. Mas o incrivel é que o aplicativo funciona de modo correto. Onde esta o truque??

8 Respostas

T

Ele pára porque encontrou o final do arquivo; dessa forma, uma exceção “EOFException” é lançada.

rafaelglauber
catch(EOFException endOfFileException)

TRATAMENTO DE EXCEÇÃO

seu software gera uma exceção que é capturada ai, ou seja, quando ele tentar ler no fim do arquivo vai dar erro que é capturado e em seguida o programa parar.

ps. nao é recomendado fazer seu controle de fluxo com exceptions, mas sim com lógica.

henriquedamota

caramba… ele pára? nossa to intrigado tb! huauhahau

vamu aguarda algum mestre ai pra desvendar o while…

abs

sk2ck

Ae pessoal, entendi o negócio da exceção. E, seguindo a dica do rafaelglauber temos:

Ao invés de:

while(true)  
             {  
                 record = (AccountRecordSerializable) input.readObject(); // realiza um downcast  
                 // coerção dos dados  
                   
                 // exibe o conteúdo de registro  
                 System.out.printf("%-10d%-12s%-12s%10.2f\n",  
                         record.getAccount(), record.getFirstName(),  
                         record.getLastName(), record.getBalance());  
             }

poderia ser substituido por:

while(input != null)  
             {  
                 record = (AccountRecordSerializable) input.readObject(); // realiza um downcast  
                 // coerção dos dados  
                   
                 // exibe o conteúdo de registro  
                 System.out.printf("%-10d%-12s%-12s%10.2f\n",  
                         record.getAccount(), record.getFirstName(),  
                         record.getLastName(), record.getBalance());  
             }

o que funcionou normalmente e de modo equivalente.

sergiotaborda

Não ha truque.
Existem 3 formas de sair de um while:

  • tornar a condição de teste falsa.
  • invocar break;
  • lançar uma exceção que não é trata dentro do while.

O codigo usa a terceira forma para parar ( o que é errado porque exceções não devem ser usada como mecanismos logicos). O codigo lê o arquivo ad infinitum ( while(true)) mas o arquivo não é infinito. Em algum ponto ele tem fim. Ao tentar ler depois do fim real, uma EOFException (End Of File Exception) será lançada. Isso
está bem explicito no codigo:

catch(EOFException endOfFileException)           
{  
 return; // fim do arquivo foi alcançado  
}
sergiotaborda

sk2ck:
Ae pessoal, entendi o negócio da exceção. E, seguindo a dica do rafaelglauber temos:

(…)
o que funcionou normalmente e de modo equivalente.

Vc pose subtituir o codigo, mas input sempre é != null portanto o codigo alterado é igual ao original
o while continua parando porque ha uma exceção sendo lançada e não porque input vira null (isso não acontece).

sk2ck

ok sergiotaborda. Mas minha intenção com o input era verificar quando chegasse o final do arquivo. Como input vc disse que é sempre != null (Por que?), gostaria de saber como então faço pra criar uma condição que verifica o final de arquivo sem usar exceções. Existe caracter de fim de arquivo??

Obrigado.

squall926

Ola!
Ele n disse q input é sempre null e sim q input é sempre != null ou seja, diferente de null.
Não lembro o retorno, mas se não é null então é -1.(mas eu acredito q seja null)

while(input != -1)
Criado 21 de fevereiro de 2008
Ultima resposta 22 de fev. de 2008
Respostas 8
Participantes 6