1

Demandez à quelques erreurs dans ce code:IOException et FileNotFoundException

Error(18,40): unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown Error(19,42): unreported exception java.io.IOException; must be caught or declared to be thrown

Mais quand on jette des exceptions filenotfound et IOException, compilateur affiche cette erreur:

Error(15,27): removeEldestEntry(java.util.Map.Entry) in cannot override removeEldestEntry(java.util.Map.Entry) in java.util.LinkedHashMap; overridden method does not throw java.io.IOException

Quel est le problème? code est ici:

package client; 

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.ObjectOutputStream; 
import java.io.IOException; 
import java.util.*; 


public class level1 { 


private static final int max_cache = 50; 

private Map cache = new LinkedHashMap(max_cache, .75F, true) { 
    protected boolean removeEldestEntry(Map.Entry eldest) { 
     boolean removed = super.removeEldestEntry(eldest); 
     if (removed) { 
      FileOutputStream fos = new FileOutputStream("t.tmp"); 
      ObjectOutputStream oos = new ObjectOutputStream(fos); 

      oos.writeObject(eldest.getValue()); 

      oos.close(); 
     } 
     return removed; 
    } 

}; 


public level1() { 
    for (int i = 1; i < 52; i++) { 
     String string = String.valueOf(i); 
     cache.put(string, string); 
     System.out.println("\rCache size = " + cache.size() + 
          "\tRecent value = " + i + " \tLast value = " + 
          cache.get(string) + "\tValues in cache=" + 
          cache.values()); 

    } 

} 

Répondre

1

Vous devez gérer la FileNotFoundException dans votre méthode removeEldestEntry (poignée comme dans l'attraper et l'enregistrer). Vous n'êtes pas autorisé à ajouter de nouvelles exceptions à la signature de la méthode lorsque vous substituez une méthode, car alors votre sous-classe n'est plus substituable à la chose que vous sous-classez.

Sinon, trouvez une autre façon de le faire afin que votre removeEldestEntry place les entrées en file d'attente et que quelque chose d'autre lise la file d'attente et effectue la sérialisation dans un fichier. En fait, après avoir lu le Javadoc, il semble qu'il doit y avoir un meilleur endroit pour mettre cette logique, le même code qui effectue réellement la suppression serait probablement un meilleur endroit pour faire la sérialisation.

1

Try this ..

package client; 

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.util.LinkedHashMap; 
import java.util.Map; 

public class Level1 { 

    private static final int max_cache = 50; 
    private Map cache = new LinkedHashMap(max_cache, .75F, true) { 

     @Override 
     protected boolean removeEldestEntry(Map.Entry eldest) { 
      boolean removed = super.removeEldestEntry(eldest); 
      if (removed) { 
       FileOutputStream fos; 
       try { 
        fos = new FileOutputStream("t.tmp"); 

        ObjectOutputStream oos = new ObjectOutputStream(fos); 

        oos.writeObject(eldest.getValue()); 

        oos.close(); 

       } catch (IOException ex) { 
        System.err.println("IOException!!"); 
       } catch (FileNotFoundException ex) { 
        System.err.println("FileNotFoundException!!"); 
       } 
      } 
      return removed; 
     } 
    }; 

    public level1() { 
     for (int i = 1; i < 52; i++) { 
      String string = String.valueOf(i); 
      cache.put(string, string); 
      System.out.println("\rCache size = " + cache.size() 
        + "\tRecent value = " + i + " \tLast value = " 
        + cache.get(string) + "\tValues in cache=" 
        + cache.values()); 

     } 

    } 
}