Dziwny problem z zapisem do pliku

0

Mam bardzo dziwny problem z zapisem do pliku. Mianowicie chodzi o poniższy kod:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class OdczytajDane
{	
	String nazwaPliku;
	public OdczytajDane(String nazwaPliku) 
	{
		this.nazwaPliku=nazwaPliku;
	}
	
	Dane odczytajModel() //throws FileNotFoundException
	{
		File plikIn = new File(this.nazwaPliku);
		
		Dane D = new Dane(naszModel,instrumenty,iloscInstrumentow);
		
		try
		{
			Scanner in = new Scanner(plikIn);
			
			(...)
	        


	                in.close();
	    
		}
		catch (FileNotFoundException e) 
		{	

			try
			{	
				String s = "file not found";
				PrintWriter zapisz = new PrintWriter("output.txt");
				zapisz.print(s);
				zapisz.close();
		
			}
			catch (FileNotFoundException e1) 
			{ 
	                       e1.printStackTrace();
	                }
                }

	    return D;
	}
}

Chodziło mi o to, aby w momencie braku pliku, stworzony został plik output.txt z komentarzem file not found. Niestety, ale do pliku nic nie jest zapisywane. Co więcej umieściłem w tym bloku wypisywanie komunikatu na konsoli i ten blok programu wykonuje się. Ponadto podobnej konstrukcji używam w innym miejscu i wszystko działa ok. Może mi ktoś powiedzieć co jest źle?

0

Jeśli go nie ma to powstaje, ale jest pusty.

Jeśli jest, to jego stara zawartość jest kasowana i plik jest pusty po wykonaniu programu.

0

Wrzucanie try do bloku catch, to co najmniej lekkomyślność. Przede wszystkim dlatego, że nowy wyjątek zastępuje stary wyjątek, który jest gubiony, a dodatkowo przez to, że w przypadku błędów wejścia-wyjścia ich stan nie jest jeszcze zresetowany (dzieje się to dopiero przy wychodzeniu z bloku). Dlatego nie ma żadnego sensu robienie operacji plikowych w bloku catch, który złapał wyjątek na systemie plików. Poza tym wrzucanie do bloku try miliona instrukcji powoduje, że nie można dowiedzieć się w łatwy sposób ile z tych instrukcji zdążyło się wykonać zanim sterowanie poszło do bloku catch. Dlatego trochę dla mnie jest nielogiczne, że w Javie zlikwidowano instrukcję try z pojedynczym poleceniem (zawsze wymagany jest blok - nawet dla pojedynczej instrukcji).
Podejrzewam, że w tym przypadku instrukcja zapisz.print(s); w ogóle się nie wykonuje skoro wciąż nie obsłużono poprzedniego wyjątku. Natomiast otwarcie i zamknięcie pliku (new i close), to co innego - tu zawsze leci wywołanie systemowe.
Poza tym w innych językach, takich jak C#, sytuacja w której wyjątek pojawia się w bloku catch jest w ogóle tak niedopuszczalny, że program od razu się wysypuje z fatal error. Szkoda, że nie w Javie.

0

tomek jedyne rozwiązanie to funkcja sprawdzająca czy plik istnieje i nigdy nie rób w cache drugiego try :0

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