Possível Bug da JVM?

6 respostas
P

Boa tarde a todos, estes dias aqui no trabalho encontrei algo que chamou minha atenção, tenho pouco tempo de experiência em java mas encontrei um problema que talvez alguém com mais experiente possa me auxiliar.

Esta classe não funciona com o código abaixo, porém se eu descomento a linha 7 e comento a linha 8 funciona.
A verificação com o “for” funciona para os dois modos, bom, eu não estou utilizando o método ready da mesma classe, porque ao encapsular o Reader no LineNumberReader eu tenho respostas diferentes, não deveriam seguir o mesmo contrato da SuperClasse.

Desde já agradeço pelas respostas

Marco Antônio Carapina da Silva

Olhe esta classe.

public class Main {

  public static void main(final String[] args) {

  final String value = "a ab abc";

  // final Reader sr = new InputStreamReader(new ByteArrayInputStream(value.getBytes()));
  final Reader sr = new StringReader(value);

  final LineNumberReader ln = new LineNumberReader(sr);

  try {
  //for (String line = null; (line = sr.readLine()) != null;)	{
      while (ln.ready()) {
            final String line = ln.readLine();
            System.out.println(line);
      }
  } catch (final IOException e) {
      e.printStackTrace();
    }

  }
}

6 Respostas

ViniGodoy

Não entendi. Qual é o erro que você está observando?

Por que você diz que “não funciona”?

P

Este método com o while entra em loop infinito. Por isso eu digo que não funciona.

ViniGodoy

Sim, isso pq o método ready, como explica o próprio contato, apenas indica se o InputStream pode ou não ser lido. InputStreams de bytes mapeados em memória sempre podem ser lidos.

E

Um vício muito comum entre os professores é o de achar que ready é a mesma coisa que o método EOF do Pascal, ou seja, pode ser usado para determinar se chegou ao final do arquivo antes de ler alguma coisa.

Esse método ready normalmente não tem o mesmo comportamento que o EOF (apenas e tão somente para arquivos em disco). Daí as pessoas aprendem desse jeito e acabam achando que é o Java que está bugado.

Em Java, normalmente você tenta ler primeiro, e então se não conseguir é que chegou ao final do arquivo. É feito desse jeito porque esse é o comportamento padrão das APIs da maioria dos sistemas operacionais.

Não se testa primeiro se chegou ao final do arquivo e depois tenta-se ler.

ViniGodoy

Se quer um comportamento assim, você pode usar a classe Scanner:

Scanner scan = new Scanner(new File("C:/teste.txt")); while (scan.hasNextLine()) { String linha = scan.nextLine(); System.out.println(linha); }

P

Perdão pela demora, formularei minha dúvida novamente porque não consegui meu objetivo na questão. (Não o de apresentar o bug, mas em formular uma pergunta correta).
Voltarei a postar.

Criado 17 de dezembro de 2010
Ultima resposta 20 de dez. de 2010
Respostas 6
Participantes 3