1

Есть некоторые ошибки в этом коде:IOException и 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

Но когда FileNotFound и IOException исключения выбрасываются, компилятор выдает сообщение об ошибке:

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

Что проблема? код здесь:

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()); 

    } 

} 

ответ

1

Вы должны обрабатывать FileNotFoundException внутри вашего метода removeEldestEntry (обрабатывать как, поймать его и зарегистрировать ее). Вам не разрешается использовать новые исключения для сигнатуры метода при переопределении метода, потому что тогда ваш подкласс больше не подменяется для того, что вы подклассифицируете.

В противном случае найдите другой способ сделать это, чтобы ваш removeEldestEntry оставил записи вверх и еще что-то читал в очереди и выполняет сериализацию в файл. Фактически после прочтения Javadoc кажется, что должно быть лучшее место, чтобы поставить эту логику, тот же код, который фактически выполняет удаление, вероятно, будет лучшим местом для сериализации.

1

Попробуйте это ..

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()); 

     } 

    } 
} 
Смежные вопросы