• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sprawdzanie poprawności odczytu danych z pliku

Object Storage Arubacloud
0 głosów
507 wizyt
pytanie zadane 21 lutego 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 21 lutego 2017 przez plkpiotr

W moim projekcie niezbędny do poprawnego działania programu jest odczyt z pliku. W interfejsie graficznym umieściłem specjalny przycisk, który po kliknięciu wywołuje okno z wyborem lokalizacji. Chciałbym zapytać, czy w języku Java jest możliwość sprawdzenia poprawności „strumienia” podobnie jak w C++ i zapętlenia programu dopóki użytkownik nie poda właściwej ścieżki z plikiem pliku, który nie spowoduje wyrzucenia żadnego z wyjątków? Jakich mechanizmów należałoby do tego użyć?

Fragment kodu odpowiadający za odczyt z pliku umieszczony w funkcji actionPerformed():

} else if (source == btnImport) {
	if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
		file = chooser.getSelectedFile();
		try {
			readFromFile(file, Main.league);
			// (...)
			JOptionPane.showMessageDialog(null, "Otwarto plik: " + file.getAbsolutePath(),
					"Beniaminek - Wczytywanie składów", JOptionPane.INFORMATION_MESSAGE);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}
komentarz 21 lutego 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Co masz na myśli właściwej mówiąć właściewej ścieżki z plikiem?
komentarz 21 lutego 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
Chodziło mi tutaj o sytuację, gdy po prostu nie zostanie wyrzucony żaden wyjątek, nie chodzi mi o plik o wskazanie pliku o konkretnej nazwie.
komentarz 21 lutego 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Ale kiedy miałby nie zostać rzucony wyjątek? Jeśli użytkownik nie poda pliku lub poda złą nazwe to wyjątek zostanie rzucony . Ewentualnei if sie nie wykona.
komentarz 21 lutego 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
Wskazanie pliku z poprawnymi danymi -> brak wyrzucenia wyjątków -> kontynuowanie pracy programu.

Wskazanie nieodpowiedniego pliku tekstowego -> wyrzucenie wyjątku np. InputMismatchException -> kolejna próba odczytu...

W ten sposób myślę : )
komentarz 21 lutego 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Okej, dobrze już wiem co masz na myśli. Tylko nie wiem co oznacza dla Ciebie odpowiedni plik tekstowy.
komentarz 21 lutego 2017 przez plkpiotr Stary wyjadacz (12,420 p.)

Hmm...  Wygląda mniej więcej tak:

Korona Kraśnik
KRA
Stadion Miejski w Kraśniku
08 08 08 08 2 6 2 8 25
Maksymilian Duda BR 13 87 78 14 9 78 63 22 88 58 85 31 65
Wiktor Dobrucki OA 12 47 23 51 74 35 69 25 75 48 8 17 0
Witold Żurek OA 12 31 79 31 41 13 56 95 75 53 78 55 51
Franciszek Towarek OA 19 94 97 39 3 80 4 31 5 24 74 71 46
Dawid Woźniak OA 25 6 97 21 52 84 49 11 79 11 87 38 92
Dawid Urbankowski PM 13 59 33 38 24 71 13 87 86 17 91 75 23
Mikołaj Waliłko PM 19 34 68 15 31 36 43 62 13 89 55 63 93

itd...

Stąd myślałem, że odpowiedni plik tekstowy będzie taki, który przejdzie bez wyrzucania wyjątków przez funkcję czytającą z pliku np. typy danych (int/String) będą w odpowiednim miejscu:

while (scanner.hasNextLine()) {
	name = scanner.nextLine();
	abbreriation = scanner.nextLine();
	stadium = scanner.nextLine();
	logo = scanner.next();
	turf = scanner.next();
	kitHome = scanner.next();
	kitAway = scanner.next();
	amountPass = scanner.nextInt();
	amountCross = scanner.nextInt();
	amountShoot = scanner.nextInt();
	strategy = scanner.nextInt();
	lineUp = scanner.nextInt();
	league.add(new Club(name, abbreriation, stadium, logo, turf, kitHome, kitAway, amountPass, amountCross,
			amountShoot, strategy, lineUp));
	for (int i = 0; i < lineUp; i++) {
		firstName = scanner.next();
		lastName = scanner.next();
		position = scanner.next();
		appearance = scanner.nextInt();
		number = scanner.nextInt();
		gkDiving = scanner.nextInt();
		gkPenalties = scanner.nextInt();
		gkReflexes = scanner.nextInt();
		dfLongPasses = scanner.nextInt();
		dfTackles = scanner.nextInt();
		dfStrengh = scanner.nextInt();
		mfLongShots = scanner.nextInt();
		mfPossesion = scanner.nextInt();
		mfShortPass = scanner.nextInt();
		fwAccuracy = scanner.nextInt();
		fwFinishing = scanner.nextInt();
		league.get(counter).getTeam()
				.add(new Player(firstName, lastName, position, appearance, number, gkDiving, gkPenalties,
						gkReflexes, dfLongPasses, dfTackles, dfStrengh, mfLongShots, mfPossesion, mfShortPass,
						fwAccuracy, fwFinishing));
		if (!scanner.hasNextLine())
			break;
	}
	counter++;
	if (scanner.hasNext())
		scanner.nextLine();
}

Bo resztę warunków np. ilość zaimportowanych klubów czy zawodników mogę sprawdzić swobodnie if'ami, jednak chciałbym zabezpieczyć aplikację gdyby ktoś wrzucił plik ze śmieciami lub plik z jedną kolumną liczb za mało ; )

komentarz 21 lutego 2017 przez Mateusz51 Nałogowiec (28,180 p.)
No i naprzykład każda metoda scanera typu next.... może rzucić Ci jeden z 3 typów wyjątku jednym z nich jest InputMismatchException. Wiec możesz zrobić żeby metoda parsująca rzucała ten wyjątek a ty możesz go przechwycić wyżej i ewentualnie otworzyć nowy plik.
komentarz 21 lutego 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 21 lutego 2017 przez plkpiotr
Ok, dzięki za zasugerowanie pomysłu - będę próbował : )

Jednak inne rozwiązanie również mile widziane ; )

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 1,250 wizyt
pytanie zadane 13 października 2019 w C i C++ przez dudduss76 Początkujący (280 p.)
0 głosów
2 odpowiedzi 5,051 wizyt
pytanie zadane 8 grudnia 2015 w C i C++ przez Evelek Nałogowiec (28,960 p.)

92,554 zapytań

141,399 odpowiedzi

319,535 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...