Unhandled exception type FileNotFoundException, już nie wiem co robić...

0

Witam.
Usiłuję w javie otworzyć plik do odczytu i... po prostu go odczytać ale jakimś cudem ciągle wyskakuje mi błąd kompilacji z nieobsługiwanym wyjątkiem. Nie mam już pojęcia co zrobić, żadna porada znaleziona w internecie nie działa...

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.FileNotFoundException;

class jtailApp {
	public static void main(String[] args) throws FileNotFoundException
	{
		System.out.println(System.getProperty("user.dir"));
	    System.out.println(jtailApp.file_get_contents("/etc/hosts"));
	}
	
	public static String file_get_contents(String fileName)
	{
	    System.out.println("file_get_contents:");
		System.out.println(fileName);
		FileReader input = new FileReader(fileName);
		StringBuilder contents = new StringBuilder();
		
		char[] buffer = new char[4096];
		int read = 0;
		
		while (true)
		{
			read = input.read(buffer);
			contents.append(buffer, 0, read);
		}
		
		return contents.toString();
	}
}

Środowisko: najnowszy Eclipse z OpenJDK6 na Gentoo Linux

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Unhandled exception type FileNotFoundException

at jtailApp.main(jtailApp.java:11)

Proszę o pomoc, muszę to błyskawicznie ogarnąć niestety.

0

Przy okazji proszę o pomoc w zrozumieniu działania funkcji file_get_contents poprzez jakieś opisanie.
Nie rozumiem np. dlaczego tutaj są 3 argumenty: contents.append(buffer, 0, read);

0
  1. A czemu piszesz ten kod lodówką? Normalne IDE samo ci taki "bląd" poprawi.
public static String file_get_contents(String fileName) throws FileNotFoundException
  1. Bo StringBuilder takich wymaga. Idiotyczne pytanie.
0
Shalom napisał(a):
  1. A czemu piszesz ten kod lodówką? Normalne IDE samo ci taki "bląd" poprawi.
public static String file_get_contents(String fileName) throws FileNotFoundException
  1. Bo StringBuilder takich wymaga. Idiotyczne pytanie.

Nie wiem czy idiotyczne bo w Javie pierwszy dzień programuję. Od 5 lat znam PHP i od 2 Pythona i widzę, że Java to coś całkiem innego.

Teraz dostaję taki błąd:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Unhandled exception type IOException
Unreachable code

at jtailApp.file_get_contents(jtailApp.java:26)
at jtailApp.main(jtailApp.java:11)

Nic a nic z tego nie rozumiem.

0

od 2 Pythona

jasne, od 20. I nie wiesz co to jest stacktrace albo wyjątek...

Ale slużę uprzejmie: Java ma 2 rodzaje wyjątków. Jedne to wyjątki czasu wykonania (RuntimeExceptions) które można rzucać skąd się chce i kiedy się chce. Drugie to wyjątki, które wymagają deklaracji i obsłużenia. Wyjątki drugiego typu (a są to wyjątki np. FileNotFoundException i IOException) wymagają żeby:

  • złapano je przez blok try..catch
    albo
  • zadeklarowano że metoda rzuca taki wyjątek dalej
    Ty w "swoim" (;]) kodzie używasz metod dzialajacych na plikach, które mogą rzucać wyjątki, a jednocześnie ani ich nie łapiesz ani nie rzucasz dalej. Ergo masz błąd kompilacji.

Podpowiem jeszcze raz: przestań programować lodówką i zainstaluj dowolne środowisko do programowania w javie.

0
Shalom napisał(a):

od 2 Pythona

jasne, od 20. I nie wiesz co to jest stacktrace albo wyjątek...

Ale slużę uprzejmie: Java ma 2 rodzaje wyjątków. Jedne to wyjątki czasu wykonania (RuntimeExceptions) które można rzucać skąd się chce i kiedy się chce. Drugie to wyjątki, które wymagają deklaracji i obsłużenia. Wyjątki drugiego typu (a są to wyjątki np. FileNotFoundException i IOException) wymagają żeby:

  • złapano je przez blok try..catch
    albo
  • zadeklarowano że metoda rzuca taki wyjątek dalej
    Ty w "swoim" (;]) kodzie używasz metod dzialajacych na plikach, które mogą rzucać wyjątki, a jednocześnie ani ich nie łapiesz ani nie rzucasz dalej. Ergo masz błąd kompilacji.

Podpowiem jeszcze raz: przestań programować lodówką i zainstaluj dowolne środowisko do programowania w javie.

Nie bardzo póki co rozumiem sensu wyjątków w czasie kompilacji a to o nie chodzi.
Bloków try, except / catch używam od zawsze w Pythonie i PHP ale ze składnią typu function () Exception { się nie spotkałem.

Udało mi się obsłużyć te wyjątki w czasie kompilacji jak na razie i teraz szukam jak sparsować argumenty wejściowe tzn. sys.argv z Pythona czy $argv z PHP.

Dziękuję za poświęcony czas i pomoc.

0

Sens jest taki, że:

  • wyjątki Runtime to wyjątki sygnalizujące że coś się zepsuło z jakiegoś powodu, ale jest to coś co się stać nie powinno i może to wymagać "złożenia się" aplikacji, przynajmniej do pewnego poziomu. Przykład takiej sytuacji to odwołanie się w tablicy poza jej zakres - ArrayIndexOutOfBoundsException. To jest coś czego w kodzie mieć nie powinniśmy i jeśli mamy to znaczy że coś się gdzieś zepsuło, albo na poziomie tej operacji raczej nie mamy jak tego "naprawić".
  • Wyjątki checked to wyjątki które sygnalizują ze wystąpiła jakaś sytuacja spoza głównej funkcjonalności (np. chciałeś czytać z pliku a pliku nie ma), ale to jest sytuacja w pewnym sensie "normalna" tzn aplikacja teoretycznie powinna być w stanie po tej sytuacji działać normalnie. Przykład to na przykład FileNotFoundException. Takie coś może nam sie zdarzyć bo user mógł podać ścieżkę do pliku którego nie ma i w takiej sytuacji możemy wyświetlić błąd i poprosić o nowy plik.

A co tu szukać? Masz w main() argument args który jest tablicą stringów które ktoś poda jako parametry.

0
Shalom napisał(a):

Sens jest taki, że:

  • wyjątki Runtime to wyjątki sygnalizujące że coś się zepsuło z jakiegoś powodu, ale jest to coś co się stać nie powinno i może to wymagać "złożenia się" aplikacji, przynajmniej do pewnego poziomu. Przykład takiej sytuacji to odwołanie się w tablicy poza jej zakres - ArrayIndexOutOfBoundsException. To jest coś czego w kodzie mieć nie powinniśmy i jeśli mamy to znaczy że coś się gdzieś zepsuło, albo na poziomie tej operacji raczej nie mamy jak tego "naprawić".
  • Wyjątki checked to wyjątki które sygnalizują ze wystąpiła jakaś sytuacja spoza głównej funkcjonalności (np. chciałeś czytać z pliku a pliku nie ma), ale to jest sytuacja w pewnym sensie "normalna" tzn aplikacja teoretycznie powinna być w stanie po tej sytuacji działać normalnie. Przykład to na przykład FileNotFoundException. Takie coś może nam sie zdarzyć bo user mógł podać ścieżkę do pliku którego nie ma i w takiej sytuacji możemy wyświetlić błąd i poprosić o nowy plik.

A co tu szukać? Masz w main() argument args który jest tablicą stringów które ktoś poda jako parametry.

Dziękuję za wytłumaczenie.

Odnośnie argumentów to chodzi mi bardziej o jakiś parser krótkich i długich argumentów, nazw plików itp.

Tzn. chciałbym przekazać przykładowo -s "test" albo --string="test" oraz przykładowo --file="/tmp/file" i z łatwością odczytać to w aplikacji.
W Pythonie i PHP jest GNU GetOpt oraz Argparse. Tutaj widzę, że jest Argparse4j i właśnie sobie z nim poradziłem ładnie, nawet w Eclipse wybrałem eksport aplikacji i ze shella mogę sobie testować.

Dziękuję za pomoc.

PS I nie używam lodówki! Te podpowiedzi w Eclipse były mylne... trzeba było posadzić dwa wyjątki a ten najpierw dawał jeden a potem go kasował i zastępował drugim...

0

@webnull_w bzdura. Eclipse dałby ci opcje do wyboru i jedną z nich byłoby rzucenie drugiego wyjątku dalej albo dodanie nowego catch do istniejącego try. Ale jak ktoś na pałe wybiera pierwszą podpowiedź to potem tak jest...

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