switch w pętli

switch w pętli
AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

Witam! Mam problem z obsługą jednego case'a w switchu. Po wybraniu odpowiedniego numeru wywołuje metode z innej klasy typu void. Po wykonaniu tej metody pokazuje sie menu i program wyrzuca mi błąd "NoSuchElementException". Co mam zrobić, aby tak nie było i dalej można było odczytać menu z maina? Dodam że cały switch i menu jest w pętli (klawisz "3" przerywa pętle) więc po każdej iteracji wczytuje mi znak na nowo

edytowany 1x, ostatnio: Adrian Paź
kiyo
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 2 lata
  • Postów:155
1

Bez pokazania kodu nikt Ci nie powie co jest źle i co musisz zrobić.

edytowany 1x, ostatnio: kiyo
AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

Metoda record() wczytuje imiona i nazwiska do momentu wpisania słowa "stop" . Kończy się sout'em.

Kopiuj
{
		Scanner scanner = new Scanner(System.in);
		try
			{
				Pracownik.lista1.addAll(File.readingNames());
				Pracownik.lista2.addAll(File.readingSurnames());
			} catch (FileNotFoundException e)
			{
				System.err.println("Nie znaleziono pliku!");
			} catch (IOException e)
			{
				System.err.println("Nieoczekiwany błąd1");
			}
		int option;
		do
			{
				System.out.println("1)Dodaj pracownika");
				System.out.println("2)Losuj pracownika");
				System.out.println("3)Wyjście");

				option = scanner.nextInt();
				switch (option)
				{
				case 1:

				{
					try
						{
							File.record();
						} catch (IOException e)
						{
							System.err.println("Nieoczekiwany błąd!");
							break;
						}
				}
					break;
				case 2:
				{
					Pracownik pracownik = new Pracownik();
					Pracownik pracownik2 = new Pracownik();
					wizytówka(pracownik.getName(), pracownik.getSurname(), pracownik.getAge());
					wizytówka(pracownik2.getName(), pracownik2.getSurname(), pracownik2.getAge());
				}
					break;
				default:
				{
					if (option == 3)
						{
							System.out.println("Miłego dnia!");
						} else
						{
							System.out.println("Spróbuj ponownie!");
						}
				}
				}
			} while (option != 3);
		scanner.close();
	}

edytowany 1x, ostatnio: Adrian Paź
kiyo
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 2 lata
  • Postów:155
0

Tak na szybko to według mnie problemem jest nextInt(). Powinieneś przed wywołaniem nextInt() sprawdzać, czy objekt Scanner hasNextInt().

AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

To dlaczego problem jest tylko przy case 1?

kiyo
Czyli np. wczytujesz trzy razy 2 i wszystko działa?
AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

Tak bez problemu wszystko działa. Tylko z tą jedynką jest problem. Wywołuje ona metode typu void z innej klasy. Ale przecież potem mam napisane break więc nie wiem. Próbowałem zrobic tak że w tamtej metodzie wywołuje metode main z tym menu ale też nie działa :/

kiyo
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 2 lata
  • Postów:155
0

Wrzuć jeszcze cały komunikat o błędzie wyrzucany przez kompilator.

Patryk27
Autor nie wspomina nic o błędzie w trakcie kompilacji przecież.
kiyo
Mea culpa! Chodziło o ślad stosu
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Najlepiej jakbyś wrzucił cały kod na pastebin. Po drugie, zacznij używać automatycznego formatowania kodu przez swoje IDE.

AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

Kod z wszystkich 3 klas? :D wolałem tego uniknąć ale ok :P A po drugie używam automatycznego (zmienionego przeze mnie) formatowania. Do tego standardu nie mam na razie ochoty się przyzwyczajać bo najzwyczajniej styl formatowania Java przeszkadza mi źle mi się tak pisze i nie jest czytelne dla mnie :/

kiyo napisał(a):

Wrzuć jeszcze cały komunikat o błędzie wyrzucany przez kompilator.
Wyrzuca mi wyjątek, błędów nie ma podczas kompilacji

Zaraz wrzuce kod z wszystkich 3 klas. Wyrzuca mi wyjątek:

3xMz27zYR7u_FWUiqndM8g.png

edytowany 3x, ostatnio: flowCRANE
Riddle
No to muszę przyznać że niezbyt ciekawe to formatowanie XD
kiyo
To wrzuć to co Ci wyrzuca
AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Jak robisz scanner.close() w klasie File to zamykasz też InputStream'a którego przekazałeś (w Twoim wypadku System.in), dlatego nie możesz zrobić już więcej scanner.nextInt()

edytowany 4x, ostatnio: Riddle
AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

Nie za bardzo wiem co mam w takiej sytuacji robić. Mam nie zamykać scannera w klasie File? Myślałem że to są dwa różne scannery i nie mają ze soba powiązania :)

Riddle
Przeczytaj proszę, moją poprzednią odpowiedź dokładnie.
AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

To jak w takich przypadkach się to robi? Tworzy się nowy scanner? Czy jest na to jakaś inna rada?

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Jeśli jeden Scanner zamknie Ci System.in, to drugi już z niego nic nie odczyta.

Zazwyczaj jedna klasa ma odpowiedzialność interakcji z kosolowym UI. To że sobie u siebie rozbiłeś na dwie klasy jest dosyć dziwne. Ogólnie, to masz 3 wyjścia (w kolejności od najgorszego do najlepszego).

  • Zostawić kod jak jest, wywalić scanner.close() z File i nie zwalniać zasobów w tym miejscu
  • Współdzielić instancję scannera między klasami (średnie).
  • Przepisać kod tak żeby tylko jedna z tych klasa pobierała i wyświetlała tekst do/od usera.
edytowany 1x, ostatnio: Riddle
AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

Chciałem żeby odczytywanie i zapis do pliku było w osobnej klasie. W sumie nie za bardzo wiem jakby to podpiąć. Tak dla mnie było czytelniej i bardziej przejrzyście :P ogólnie nie miałem w zamyśle tego menu więc problemu nie było. Teraz na to wpadłem :D :) co do drugiej metody to powiesz coś więcej? czy to kwestia douczenia się? Jak takie rzeczy się robi/czego szukać w necie? jakoś to się nazywa? :D co do pierwszej metody.. czytałem i słyszałęm cały czas że "wypadałoby" zamknąć scanner. coś się dzieje, jak się go nie zamyka?

edytowany 1x, ostatnio: Adrian Paź
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
Adrian Paź napisał(a):

Chciałem żeby odczytywanie i zapis do pliku było w osobnej klasie. W sumie nie za bardzo wiem jakby to podpiąć. Tak dla mnie było czytelniej i bardziej przejrzyście :P ogólnie nie miałem w zamyśle tego manu więc problemu nie było. Teraz na to wpadłem :D :)

No to czemu nie możesz rozdzielić zapisywania/odczytywania danych do jednej klasy, a komunikacji z userem przez konsolę w drugiej? Przecież to są dwie, zupełnie różne odpowiedzialności.

Adrian Paź napisał(a):

co do drugiej metody to powiesz coś więcej? czy to kwestia douczenia się? Jak takie rzeczy się robi/czego szukać w necie? jakoś to się nazywa? :D

No możesz zrobić beznadziejnie (tak jak teraz masz w swoim kodzie) pole statyczne i korzystać w niego wszędzie. Albo zrobić lepiej i przekazać ten Scanner w polu konstruktora klasy w której chcesz z niego skorzystać. Ale jak już mówiłem, zamiast go współdzielić, korzystniej by było lepiej rozplanować odpowiedzialności klas.

Adrian Paź napisał(a):

co do pierwszej metody.. czytałem i słyszałęm cały czas że "wypadałoby" zamknąć scanner. coś się dzieje, jak się go nie zamyka?

Zależnie od platformy jvm zwolni (lub nie) zasoby takiego InputStreama. Im lepsza kontrola takimi zasobami, tylko apka staje się mniej pamięciożerna.

AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

Przecież w zapisie do pliku właśnie używam scannera do wpisywania imion do PrintStreama. Nie wiem chyba żeby w klasie Firma podawać imiona do tablicy w pętli i przekazać tą tablice jako parametr do metody record. Bo z tym konstruktorem nie wiem jak zrobić.

edytowany 1x, ostatnio: Adrian Paź
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
Adrian Paź napisał(a):

Przecież w zapisie do pliku właśnie używam scannera do wpisywania imion do PrintStreama.

No, może ciężko Ci to zrozumieć na razie ale to nie jest "jedna rzecz". Interakcja usera z aplikacją to jedno, a to co aplikacja robi z danymi (zapis do pliku) to coś innego. Nie należy tego na siłę łączyć. Niby, po ch** zapis do pliku ma cokolwiek wiedzieć o System.in? :D

Adrian Paź napisał(a):

Nie wiem chyba żeby w klasie Firma podawać imiona do tablicy w pętli i przekazać tą tablice jako parametr do metody record.

Tablica, stringi/zmienne, wszystko jedno (ja bym wybrał zmienne). Tak, to jest całkiem spoko rozwiązanie.

Adrian Paź napisał(a):

Bo z tym konstruktorem nie wiem jak zrobić.

Nie wiesz, bo używasz tylko metod statycznych (które, btw, nie są zbyt eleganckim rozwiązaniem).

edytowany 1x, ostatnio: Riddle
AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

Używam metod statycznych żeby nie tworzyć za każdym razem nowych obiektów tak wydawało mi się jest szybciej i wygodniej xD

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
1
Adrian Paź napisał(a):

Używam metod statycznych żeby nie tworzyć za każdym razem nowych obiektów tak wydawało mi się jest szybciej i wygodniej xD

screenshot-20180505212510.png

AP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

hahaha czemu? :D czyli powinno się zawsze tworzyć te instancje?

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Zainteresuj się zasadami SOLID (a w szczególności Dependency Inversion). Możesz też pogooglać "OOP" ale to dużo bardziej obszerny temat. Chodzi o kilka implementacji tego samego interfejsu i polimorfizm. To są bardzo przydatne mechanizmy, nie mówiąc o większej testowalności i maintainability.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)