2010-09-18 10 views
0

Je suis en train d'écrire une implémentation de deque avec ArrayList comme requis par mon instructeur. Jusqu'à présent, le corps de la classe ressemble à ceciProblème lors de la lecture d'un fichier binaire dans un fichier

try { 
     while (!endOfFile) { 
      character = inputFile.readChar(); 
      while (!character.equals('\u0003')) { 
       if (character.equals('\u0008')) 
        deck.removeBack(); 
       else 
        deck.addToBack(character); 
      } 
     } 

     while (!deck.isEmpty()) { 
      character = deck.removeFront(); 
      if (character.equals('\u0003')) 
       System.out.print("\n"); 
      else 
       System.out.print(character); 
     } 
    } catch (EOFException e) { 
     endOfFile = true; 
    } 

Le deque est initialisé comme

Deque<Character> = new deck Deque<Character>() 

J'ai testé mon Deque avec une classe de test séparé et je suis tout à fait sûr qu'il fonctionne correctement . Mais chaque fois que j'essaie d'exécuter cette classe de lecture, elle provoque une java.lang.OutOfMemoryError sur la ligne deck.addToBack (character). Qu'est-ce qui cause le problème et comment peut-il être évité?

Modifier: Ma mise en œuvre de la Deque. L'interface a été fournie par mon instructeur.

import java.util.*; 
public class Deque<T> extends ArrayList<T> implements DequeInterface<T> { 

public Deque() 
{ 
    super(); 
} 

public void addToFront(T newEntry) { 
    add(0, newEntry); 
} 

public void addToBack(T newEntry) { 
    add(newEntry); 
} 

public T removeFront() { 
    T entry = null; 
    entry = get(0); 
    remove(0); 
    return entry; 
} 

public T removeBack() { 
    T entry = null; 
    entry = get(size() - 1); 
    remove(size() - 1); 
    return entry; 
} 

public T getFront() { 
    T entry = get(0); 
    return entry; 
} 

public T getBack() { 
    T entry = get(size() - 1); 
    return entry; 
} 

public boolean isEmpty() { 
    if (size() == 0) 
     return true; 
    else 
     return false; 
} 

public void clear() { 
    clear(); 
} 

}

+0

Si votre implémentation deque provoque OutOfMemoryError, cela signifie que vous devez vérifier l'implémentation elle-même. Pas le code de test. À l'heure actuelle, il n'y a aucun moyen de parler de la cause de l'erreur. –

+0

Merci. Implémentation ajoutée. S'il vous plaît, jetez un oeil. – Francis

Répondre

1
while (!endOfFile) { 
     character = inputFile.readChar(); 
     while (!character.equals('\u0003')) { 
      if (character.equals('\u0008')) 
       deck.removeBack(); 
      else 
       deck.addToBack(character); 
     } 
    } 

Vérifiez vos conditions de sortie de boucle extérieure.

Est-ce que readChar renvoie -1 pour indiquer la fin des données? Cela provoquerait probablement une boucle infinie entraînant l'épuisement de la mémoire.

+0

Indique-t-il la fin des données normalement? Comment pourrais-je l'empêcher? – Francis

+0

@Francis - il n'est pas possible de dire sans connaître le type de 'inputFile'. Vérifiez sa documentation: http://download.oracle.com/javase/6/docs/api/ Mais mon point principal est que si rien dans la boucle ne change 'endOfFile', la boucle ne se terminera jamais. – McDowell