Odczyt z pliku

0

Witam wszystkich na forum,
dopiero zaczynam uczyć się Javy, niestety napotkałem na problem przy odczycie danych z pliku.
Mam taki kod:

import java.io.*;
public class Main {

    public static void main(String[] args) {
        
        // OTWIERANIE PLIKU:
        FileReader fr = new FileReader("a.txt");
        BufferedReader br = new BufferedReader(fr);
   

    }
}

Mimo, że plik a.txt istnieje w folderze z programem, wyświetla mi błąd o treści:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
at Main.main(Main.java:7)
Java Result: 1

Proszę o jakieś rady.
Pozdrawiam :)

0

Musisz obsłużyć wyjątek. Generowany przez konstruktor FileReader.
http://download.oracle.com/javase/6/docs/api/java/io/FileReader.html

0

Wszystkie operacje na pliku musisz dać w try i przechwycic wyjątki.

0

Hej, podepnę się pod temat bo brzmi podobnie ...
problem:
poniższy kod powoduje błąd:
linia 16: error: unreported FileNotFoundException; must be caught or declared to be thrown
Lerning.lern (void);

import java.util.Scanner;
import java.io.FileNotFoundException;

public class Program{
public static void main(String[] args){

System.out.println("MENU GLOWNE");
System.out.println("aby zaladowac zestaw slowek wybierz 1");
System.out.println("aby wprowadzic nowe slowka wybierz 2");
Scanner menu = new Scanner(System.in);
int option = menu.nextInt();

switch (option){
case 1:
System.out.println("ta opcja pozwoli przegladac slowka");
Lerning.lern ();
break;

case 2:
System.out.println("ta opcja pozwoli dodac slowka");
break;

default:
System.out.println("nowy wybor");
}
}
}
 

Na wszelki wypadek także kod Lerning:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Lerning{
public static void lern () throws FileNotFoundException {

File plik = FileAgent.open ();

Scanner in = new Scanner(plik);
String line;
do{
line = in.nextLine(); //pobieranie kolejnych linii
System.out.println(line);
}while(line!= null );

//while (in.hasNextLine())
// System.out.println(in.nextLine());
}
}
 

z góry dzięki za wszelką okazaną pomoc
KOch

0

Musisz albo opakować operacje na pliku w try {} catch() {} albo dodać deklarację rzucanych wyjątków do funkcji.

0
winerfresh napisał(a)

dodać deklarację rzucanych wyjątków do funkcji

Dałbyś radę rozwinąć tą myśl - nad Javą siedzę 4 dzień w życiu :)

A z kolei temu catch mam nie przekazywać żadnego parametru?

0
import java.io.*;
public class Main {
 
    public static void main(String[] args) throws Exception{
 
        // OTWIERANIE PLIKU:
        FileReader fr = new FileReader("a.txt");
        BufferedReader br = new BufferedReader(fr);
 
 
    }
}

tak powinien wyglądać Twój kod.

1

A dokładnie to tak:

import java.io.*;
public class Main {
    public static void main(String[] args) {
        // OTWIERANIE PLIKU:
        try {
            FileReader fr = new FileReader("a.txt");
            BufferedReader br = new BufferedReader(fr);
        } catch (FileNotFoundException ex) {
            /* obsługa wyjątku */
        }
    }
}

Przykład - zakończenie programu z błędem w przypadku nieznalezienia pliku:

import java.io.*;
public class Main {
    public static void main(String[] args) {
        BufferedReader reader;

        try {
            reader = new BufferedReader(new FileReader("a.txt"));
        } catch (FileNotFoundException ex) {
            System.err.println("nie znaleziono a.txt");
            System.exit(666);
            return;
        }

        // wczytywanie...
        reader.readLine();
        // ...
    }
}

Oczywiście metody odczytujące również mogą sypnąć wyjątkiem (IOException), który też należy przechwycić.

0

Czy wy piszecie te programy na kartkach ? :)

Przecież każdy IDE ma już w tych czasach tak rozwinięty system podpowiedzi że te problemy rozwiązuje w mgnieniu oka przy pomocy dwóch kliknięć :)

0

Hej, to jednak nie koniec moich tarapatów z tym:

w main wywołuję metodę taką linią:
File plik = FileAgent.open ();
chcę by metoda pobierała nazwę pliku i przekazywała już otwarty plik mainowi. Oto i metoda:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.io.*;

public class FileAgent{
static String name; //przechowuje nazwę pliku

	public static File open() {

//poniższy fragment kodu otwiera plik wskazany przez użytkownika	 
		 
		Scanner read = new Scanner(System.in); // obiekt do odbierania danych użytkownika 
				
		System.out.println("Podaj nazwę pliku do wczytania (wraz z rozszerzeniem):");
		name=read.nextLine ()	; // tu użytkownik wprowadza nazwę pliku
				 
		try{ 
			FileReader fr = new FileReader (name);
			BufferedReader br = new BufferedReader (fr);
			File file = br;      
		 } catch (FileNotFoundException ex) {
			System.out.println("Plik nie istnieje! ");
			}
		return file;
	}
//tu jest kod innej metody stąd zmienna "name" jest "globalna"
} 

kompilacja powoduje błąd:
incompatible types: File file = br;

sprawdziłem też wersję: File file = BufferedReader (fr); File file = fr;

Co jest źle? Jak powinno być?

0

Nie wiem do potrzebujesz tej metody, ale jest ona raczej bez sensu. Zwracaj BufferedReader.
Btw, sprawdź w słowniku pisownię słowa użytkownik.

0

zwracaj BufferedReader to znaczy?

return BufferedReader (fr) ?

Skoro ta metoda jest "bez sensu":
Jak powinna w związku z tym wyglądać metoda, która pobierze nazwę pliku otworzy go i przekażę na użytek main (lub innej metody), mająca sens???

0

Skoro Twoja metoda odpytała użytkownika o nazwę pliku i udostępniła plik do odczytu, to jaki ma sens zwracanie obiektu File? Chcesz go jeszcze raz otwierać?

public static BufferedReader open() {
 
//poniższy fragment kodu otwiera plik wskazany przez użytkownika         
 
                Scanner read = new Scanner(System.in); // obiekt do odbierania danych użytkownika 
 
                System.out.println("Podaj nazwę pliku do wczytania (wraz z rozszerzeniem): ");
                name=read.nextLine (); // tu użytkownik wprowadza nazwę pliku
                BufferedReader br;
 
                try{ 
                        FileReader fr = new FileReader (name);
                        br = new BufferedReader (fr);
                 } catch (FileNotFoundException ex) {
                        System.out.println("Plik nie istnieje! ");
                        }
                return br;
        }
//tu jest kod innej metody stąd zmienna "name" jest "globalna"
} 

Jeśli otwarcie się nie powiedzie, to metoda zwróci null, w przeciwnym razie zwróci Stream, z którego możesz czytać.

0

Jesteś pewien, że to działa?
Mam kod ja powyżej i kompilacja daje komunikat
"variable br might not have been initialized"
(strzałeczka wskazuje na br w linii: return br) :(

0

Zmień ten wiersz na

BufferedReader br=null;

1 użytkowników online, w tym zalogowanych: 0, gości: 1