adrian.paz Temat założony przez niniejszego użytkownika |
» 2018-04-14 18:03:26 Ok zmieniłem break na continue i na początku pętli ustawiłem ponownie isOk na true żeby po break'u nie było false ale wykonuje się nieskończona pętla. Jak wyczyścić bufor? jak dam token.nextToken() to wyskakuje mi błąd "java.util.NoSuchElementException" |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2018-04-14 18:13:21 Jak wyczyścić bufor klasy Tokenizer? Pętla się wykonuje w nieskończoność mimo że w pętli na początku ustawiłem na false.. Mógłby ktoś poprawić mój kod? package ć w5;
import java.util.Scanner; import java.util.StringTokenizer;
public class Zad2 { String linia; static double wyn = 0; static boolean isNotOk = false; static double kalkulator( String linia ) { String errorMessage = "\nWadliwe dane! Spróbuj ponownie!\n"; StringTokenizer token = new StringTokenizer( linia ); do { isNotOk = false; if( token.countTokens() != 3 ) { System.err.println( errorMessage + " 1" ); isNotOk = true; continue; } String a = token.nextToken(), b = token.nextToken(), c = token.nextToken(); int num1 = 0, num2 = 0; try { num1 = Integer.parseInt( a ); num2 = Integer.parseInt( c ); } catch( NumberFormatException e ) { System.err.println( errorMessage + " 2" ); isNotOk = true; continue; } char znak = b.charAt( 0 ); if( b.length() != 1 ||( znak == '/' && num2 == 0 ) ) { System.out.println( errorMessage + " 3" ); isNotOk = true; continue; } switch( znak ) { case '+': wyn = num1 + num2; break; case '-': wyn = num1 - num2; break; case '*': wyn = num1 * num2; break; case '/': wyn = num1 / num2; break; case '%': wyn = num1 % num2; break; default: { System.out.println( errorMessage + " 4" ); isNotOk = true; continue; } } } while( isNotOk ); return wyn; } public static void main( String[] args ) { System.out.println( "Witaj w moim kalkulatorze! Wprowadz jakieś działanie (np. 1 + 2)" ); Scanner skan = new Scanner( System.in ); String linia = skan.nextLine(); System.out.println( "Wynik: " + Zad2.kalkulator( linia ) ); skan.close(); } }
|
|
jankowalski25 |
» 2018-04-14 18:51:27 Pętla się wykonuje w nieskończoność mimo że w pętli na początku ustawiłem na false.. |
No właśnie, na początku. A kiedy jest sprawdzany warunek w pętli? Najlepiej zbuduj prawidłowy warunek kończący pętlę zamiast takiego udziwniania (może się składać z kilku wyrażeń, jeśli to coś uprości). Najlepiej nie używaj break ani continue , w większości przypadków tak będzie łatwiej i dzięki temu wszystkie sytuacje przerywające pętlę znajdą się w jej warunku (a nieco mniej typowe sytuacje trafią do catch ). wyskakuje mi błąd "java.util.NoSuchElementException" |
Słowo "Exception" wyraźnie wskazuje na to, że to jest wyjątek (więc możesz go przechwycić, jeśli tego potrzebujesz, prawda?). Jak wyczyścić bufor klasy Tokenizer? |
Tak samo, jak w C++ można wyczyścić strumień, czyli wystarczy wczytać wszystkie dane. Jeśli wczytasz za dużo, to w Javie dostaniesz wcześniej wspomniany wyjątek, więc możesz albo sprawdzić, ile tego jest, albo czytać tak długo, aż złapiesz wyjątek. |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2018-04-14 19:11:20 Nie sądziłem, że taki warunek to wydziwianie. Myślałem, że to będzie coś prostego: powtarzaj pętle tak długo dopóki coś będzie się chrzanić czyli jeżeli isNotOk==true... Złe takie myślenie? |
|
pekfos |
» 2018-04-14 19:20:14 try { num1 = Integer.parseInt( a ); num2 = Integer.parseInt( c ); } catch( NumberFormatException e ) { System.err.println( errorMessage + " 2" ); isNotOk = true; continue; } |
Wyczuwam objawy kopiowania kodu bez rozumienia, co robi. Po co łapiesz wyjątek tak szybko jak tylko się da i potem kombinujesz pod górę, jak z obsługi wyjątku wyjść z pętli..? Niech to jest za pętlą, jak będzie wyjątek to automatycznie z niej wyjdziesz. |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2018-04-15 12:39:31 Czyli w catch'u zarówno continue jak i isNotOk=tru jest zbędne? |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2018-04-15 13:16:56 Wkurzała mnie ta pętla więc zrobiłem to inaczej. Po prostu wywołałem nowo napisana metodę setLine() w każdym z wyjątków :) Czy tak można robić? Nawet bardziej czytelnie jest tylko śmiesznie, że w main jest tylko jedna linijka :) Linijka wywołująca metodę setLine() :D EDIT: Teraz proszę już bez zagadek bo zwariuje! Wszystko jest ok w programie tylko problem jest taki, że po wyłapaniu wyjątku i wywołaniu metody setLine() potem jak już dobrze wszystko wpisze to wyrzuca mi NoSuchElementException... W którym miejscu jest błąd? :(( package ć w5;
import java.util.Scanner; import java.util.StringTokenizer;
public class Zad2 { String linia; static double wyn = 0; static double kalkulator( String linia ) { String errorMessage = "\nWadliwe dane! Spróbuj ponownie!\n"; StringTokenizer token = new StringTokenizer( linia ); if( token.countTokens() != 3 ) { System.err.println( errorMessage + " 1" ); Zad2.setLine(); } String a = token.nextToken(), b = token.nextToken(), c = token.nextToken(); int num1 = 0, num2 = 0; try { num1 = Integer.parseInt( a ); num2 = Integer.parseInt( c ); } catch( NumberFormatException e ) { System.err.println( errorMessage + " 2" ); Zad2.setLine(); } char znak = b.charAt( 0 ); if( b.length() != 1 ||( znak == '/' && num2 == 0 ) ) { System.err.println( errorMessage + " 3" ); Zad2.setLine(); } switch( znak ) { case '+': wyn = num1 + num2; break; case '-': wyn = num1 - num2; break; case '*': wyn = num1 * num2; break; case '/': wyn = num1 / num2; break; case '%': wyn = num1 % num2; break; default: { System.out.println( errorMessage + " 4" ); Zad2.setLine(); } } return wyn; } static void setLine() { System.out.println( "Witaj w moim kalkulatorze! Wprowadz jakieś działanie (np. 1 + 2)" ); Scanner skan = new Scanner( System.in ); String linia = skan.nextLine(); double wynik = Zad2.kalkulator( linia ); System.out.println( "Wynik: " + wynik ); skan.close(); } public static void main( String[] args ) { Zad2.setLine(); } }
|
|
pekfos |
» 2018-04-15 13:20:25 Zastępowanie pętli rekurencją nie jest poprawne. Czyli w catch'u zarówno continue jak i isNotOk=tru jest zbędne? |
Złe pytanie. |
|
1 « 2 » 3 4 |