2013-03-07 13 views
5
public static int howMany(String FileName) 
{ 
    BufferedReader br = null; 

    try 
    { 
     FileInputStream fis = new FileInputStream(FileName); 
     DataInputStream dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.print("FILE DOESN'T EXIST"); 
    } 
    finally 
    { 
     fis.close(); 
     dis.close(); 
     br.close(); 
    } 


    String input; 
    int count = 0; 

    try 
    { 

     while ((input = br.readLine()) != null) 
     { 
      count++; 
     } 

    } 
    catch (IOException e) 
    { 
     System.out.print("I/O STREAM EXCEPTION"); 
    } 


    return count; 
} 

Z jakiegoś powodu nie mogę zamknąć żadnych obiektów I/O. fis.close(), dis.close(), br.close() wszystko da mi, nie mogę znaleźć symbolu, mimo że zaimportowałem całą bibliotekę I/O (import java.io. *;) i zainicjowałem wszystkie obiekty."Nie można odnaleźć symbolu" podczas próby zamknięcia obiektów wejścia/wyjścia

+0

hurr otrzymuję błąd: nierejestrowany wyjątek IOException; musi zostać złapany lub zadeklarowany jako rzucony 3 razy teraz –

Odpowiedz

5
BufferedReader br = null; 
FileInputStream fis =null; 
DataInputStream dis null; 
try { 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 

Odłóż je od swojego try block, aby twój blok mógł zobaczyć zmienne.

+0

hurr otrzymuję błąd: niezgłoszony wyjątek IOException; musi zostać złapany lub zadeklarowany jako rzucony 3 razy teraz –

+0

@MatthewLoch umieścić kolejny blok catch i złapać wyjątek IOException. ale upewnij się, że twój hirarchey catch jest catch (FileNotFound) {} ​​catch (IOException) – PermGenError

+0

naprawiono go nevermind –

1

Musisz zadeklarować wszystkie strumienie zewnątrz bloku try, w przeciwnym razie nie będą one widoczne w bloku finally:

FileInputStream fis = null; 
DataInputStream dis = null; 
BufferedReader br = null; 

Alternatywnie, można użyć nowej składni Java 7 jest try-with-resources zautomatyzować zasób zamknięcie.

1

Twoje obiekty są pod rygorem wewnątrz bloku

FileInputStream fis =null; 
DataInputStream dis null; 

definiować je na zewnątrz bloku coś takiego

try{ 

    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 

    } 
0

Masz określania zakresów fis do wewnątrz bloku try więc końcowy nie wie jest tutaj. Spróbuj:

FileInputStream fis; 
DataInputStream dis; 
try 
    { 
     fis = new FileInputStream(FileName); 
     dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
0

Spróbuj tego:

BufferedReader br = null; 
FileInputStream fis = null; 
DataInputStream dis = null; 
try 
{ 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 
0

Kompilator narzeka, że ​​zmienne masz odniesienie w bloku finally nie są w zakresie w tym punkcie, co istniejące odpowiedzi pokrycia odpowiednio. Istnieje jednak wiele innych problemów.

Dużym problemem jest to, że próbujesz odwołać się do BufferedReader po jego zamknięciu. Przenieś logikę liczenia do pierwszego bloku try i pozbądź się drugiego.

Gdy połączysz czytniki i strumienie, tak jak w twoim przykładzie, tylko najbardziej zewnętrzny powinien zostać zamknięty. BufferedReader zapisuje odwołanie do czytnika przekazanego do niego i upewni się, że zostanie zamknięte, gdy jest. Podobnie InputStreamReader zamknie przekazany do niego strumień wejściowy, który zamknie przekazany do niego plikInputStream.

FIS i dis zmienne nie są nawet konieczne, można zagnieździć wywołania konstruktorów:

br = new BufferedReader(new InputStreamReader(
     new DataInputStream(new FileInputStream(FileName)))); 

Umieszczenie więcej niż jednej szczelnie w bloku finally jest złe; jeśli wystąpi wyjątek podczas zamykania jednego z nich, pozostałe zasoby nie zostaną zamknięte.

Również wyjątek zgłoszony w bloku finally będzie maskował każdy wyjątek zgłoszony w bloku try. Oryginalny wyjątek (z informacją o tym, co poszło nie tak) jest odrzucany, a wyjątek zgłoszony na zamknięciu (który nie jest informacyjny) jest tym, który jest propagowany.

Byłoby znacznie lepiej sprawdzić try-z-zasobami, który ma na celu zamknięcie wielu zasobów i usunięcie możliwości maskowania wyjątków.

Powiązane problemy