2013-12-19 3 views
1

Хорошо, это будет немного длиннее. Поэтому я тестировал тестовую программу junit для тестирования своей программы. Я хотел, чтобы проверить, является ли метод, который использует сканер для чтения файла в программе кинул и исключение, если файл не существует, как это:file.delete() не удалять файл, java

@Test 
public void testLoadAsTextFileNotFound() 
{ 
    File fileToDelete = new File("StoredWebPage.txt"); 

    if(fileToDelete.delete()==false) { 
     System.out.println("testLoadAsTextFileNotFound - failed"); 
     fail("Could not delete file"); 
    } 

    try{  
     assertTrue(tester.loadAsText() == 1); 
     System.out.println("testLoadAsTextFileNotFound - passed"); 
    } catch(AssertionError e) { 
     System.out.println("testLoadAsTextFileNotFound - failed"); 
     fail("Did not catch Exception"); 

    } 
} 

Но тест не в «не может удалить файл» , поэтому я сделал несколько поисков. Путь верен, у меня есть права на файл, потому что программа сделала это в первую очередь. Таким образом, единственным вариантом будет то, что поток в файл или из него все еще работает. Поэтому я проверил метод и другой метод, который использует файл, и насколько я могу, оба потока закрываются внутри методов.

protected String storedSite; //an instance variable 
/** 
* Store the instance variable as text in a file 
*/ 
public void storeAsText() 
{ 
    PrintStream fileOut = null; 
    try{ 
     File file = new File("StoredWebPage.txt"); 
     if (!file.exists()) { 
      file.createNewFile(); 
     } 

     fileOut = new PrintStream("StoredWebPage.txt"); 
     fileOut.print(storedSite); 
     fileOut.flush(); 
     fileOut.close(); 

    } catch(Exception e) { 
     if(e instanceof FileNotFoundException) { 
      System.out.println("File not found"); 
     } 
     fileOut.close(); 
    } finally { 
     if(fileOut != null) 
      fileOut.close(); 
    } 
} 

/** 
* Loads the file into the program 
*/ 
public int loadAsText() 
{ 
    storedSite = ""; //cleansing storedSite before new webpage is stored 
    Scanner fileLoader = null; 
    try { 
     fileLoader = new Scanner(new File("StoredWebPage.txt")); 
     String inputLine; 
     while((inputLine = fileLoader.nextLine()) != null) 
      storedSite = storedSite+inputLine; 
     fileLoader.close(); 
    } catch(Exception e) { 
     if(e instanceof FileNotFoundException) { 
      System.out.println("File not found"); 
      return 1; 
     } 
     System.out.println("an Exception was caught"); 
     fileLoader.close(); 
    } finally { 
     if(fileLoader!=null) 
      fileLoader.close(); 
    } 

    return 0; //return value is for testing purposes only 
} 

У меня нет идей. Почему я не могу удалить файл?

EDIT: я отредактировал код, но все это дает мне ту же проблему: S

+1

Возможно, не совсем ваша проблема, но уверены ли вы, что в коде отсутствует другое исключение, кроме FileNotFoundException? Например, проблемы при закрытии ваших потоков и т. Д. Поскольку перехват всех исключений и обработка только FileNotFoundException выкидывает все остальные исключения, не сообщая вам, что возникла какая-либо проблема. –

+1

Также имейте в виду, что Windows не позволит вам удалить любой файл, открытый любым процессом. – chrylis

ответ

3

У вас есть две проблем здесь. Во-первых, если исключение во время записи в файл, выходной поток не закрыт (то же самое для чтения):

try { 
    OutputStream someOutput = /* a new stream */; 

    /* write */ 

    someOutput.close(); 

Вторая проблема заключается в том, что если есть исключение вы не уведомляются :

} catch (Exception e) { 
    if (e instanceof FileNotFoundException) { 
     /* do something */ 
    } 

    /* else eat it */ 
} 

Таким образом, проблема почти наверняка заключается в том, что бросается какое-то другое исключение, и вы не знаете об этом.

'правильное' идиомы, чтобы закрыть поток выглядит следующим образом:

OutputStream someOutput = null; 
try { 
    someOutput = /* a new stream */; 

    /* write */ 

} catch (Exception e) { 
    /* and do something with ALL exceptions */ 

} finally { 
    if (someOutput != null) someOutput.close(); 
} 

Или в Java 7 вы можете использовать try-with-resources.

+0

И всегда печатайте и/или записывайте трассировку стека. – chrylis

+0

Я отредактировал код, но все же это не решило проблему: я забыл распечатать что-то для всех других исключений на storeastext, и в этом была проблема. Это заставило другое исключение – Tomas0206

+0

Зачем? Распечатайте трассировку стека с помощью 'e.printStackTrace();' похоже на @chrylis. Также помните, что вам не нужно закрывать блок catch. Для этого нужен блок finally. – Radiodef

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