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

wyjątki, pętle

0 głosów
105 wizyt
pytanie zadane 15 kwietnia 2018 w Java przez Adrian Paź Obywatel (1,270 p.)

Witam proszę o naprowadzenie lub poprawienie kodu. Na innym forum ktoś powiedział, żebym zamiast rekurencji użył pętli ale próbowałem już na wiele sposobów i nie wiem jak to zrobić :( Ogólnie program się sypie i rzuca wyjątek NoSuchElementException tylko gdy po błędnym wpisaniu danych w następnej pętli wpiszemy je dobrze. Wypisuje wynik ale i wyjątek. Pomocy! Jestem nowy dopiero się ucze, a nikt mnie nie może naprowadzić i wskazać 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);
				Zad2.setLine();
			}

		String a = token.nextToken(), // pierwsza liczba
				b = token.nextToken(), // znak
				c = token.nextToken(); // druga liczba

		int num1 = 0, num2 = 0; // pomocnicze zmienne

		try
			{
				num1 = Integer.parseInt(a);
				num2 = Integer.parseInt(c);
			} catch (NumberFormatException e)
			{
				System.err.println(errorMessage);
				Zad2.setLine();
			}
		char znak = b.charAt(0);
		if (b.length() != 1 || (znak == '/' && num2 == 0))
			{
				System.err.println(errorMessage);
				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);
				Zad2.setLine();
			}
		}

		return wyn;

	}

	static void setLine()
	{
		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)
	{
		System.out.println("Witaj w moim kalkulatorze! Wprowadz jakieś działanie (np. 1 + 2)");
		Zad2.setLine();
	}

}

 

komentarz 15 kwietnia 2018 przez Hiskiel Pasjonat (22,800 p.)
No to spytaj się na tym innym forum jak to zrobić
komentarz 15 kwietnia 2018 przez Adrian Paź Obywatel (1,270 p.)
Jedyna odpowiedx jaka padła i nikt nie chce powiedzieć dlaczego to: "Nie łap wyjątków, jeśli ich obsługa w danym momencie nie ma sensu" Nic nie rozumiem

1 odpowiedź

+1 głos
odpowiedź 15 kwietnia 2018 przez Wiciorny Maniak (66,480 p.)
 String linia = skan.nextLine();

Co tutaj chcesz  zczytać? Skoro skaner jest pusty?  "? nie ma elementów' No Such element. 

komentarz 15 kwietnia 2018 przez Adrian Paź Obywatel (1,270 p.)
Skoro nie ma elementów i skaner jest pusty (chociaż dziwne bo przecież wpisuje na nowo od usera) to czemu oprócz wyjątku normalnie wyświetla wynik? widocznie wczytało bo inaczej wynik byłby 0.0. Wyjaśnisz to szerzej?
komentarz 15 kwietnia 2018 przez Wiciorny Maniak (66,480 p.)

wpisuje na nowo od usera)

Jak wpisujesz? Nie wpisujesz, niby w którym momencie?  

komentarz 15 kwietnia 2018 przez Adrian Paź Obywatel (1,270 p.)

No przecież wywołuje metode w której powtarzam całą czynność czyli tworzę nowy Scanner wczytuje nową linie metodą nextLine i tą linie znów przekazuje jako paramet kalkulatorowi. 

P.S teraz mi gość odpisał ale już poddenerwowany chyba a ja dalej go nie rozumiem 

"A to twoim zdaniem jest sensowna obsługa błędu? Wywołanie rekurencyjne jest złe, powinno być zwrócenie wartości, ale ta wartość będzie wtedy wyświetlona jako wynik, a wyjątek w tym miejscu oznacza, że nie ma poprawnego wyniku. Jak funkcja zwraca wynik, ale się nie da, to może np wyrzucić wyjątek. Na przykład właśnie ten wyjątek, o ile nie będziesz mu przeszkadzać swoją obsługą błędów."

O CO MU CHODZI? Mam całkiem zrezygnować z blogu try...catch czy zamiast setLine ma być return wyn?? 

              try
			{
				num1 = Integer.parseInt(a);
				num2 = Integer.parseInt(c);
			} catch (NumberFormatException e)
			{
				System.err.println(errorMessage);
				Zad2.setLine();
			}

 

komentarz 15 kwietnia 2018 przez Wiciorny Maniak (66,480 p.)

Wywołujesz metode ? Kiedy ją wywołujesz... 

 static void setLine()
    {
        Scanner skan = new Scanner(System.in);
        String linia = skan.nextLine();
 
        double wynik = Zad2.kalkulator(linia);
        System.out.println("Wynik: " + wynik);
        skan.close();
    }

 

 double wynik = Zad2.kalkulator(linia);

tu wywołujesz metode kalkulator która jest dopiero uruchamiana po zczytaniu :) a wniej masz swój kod choćby który napisałeś powyżej , a zczytujesz zanim ja wywołujesz... więc ? Zrozum jak skanowany jest kod, modfikator statyczny nie powoduje że metoda działa bez jej odwołania na rzecz samej klasy 

komentarz 15 kwietnia 2018 przez Adrian Paź Obywatel (1,270 p.)
Teraz to już całkiem zgłupiałem.. To jak mam to zrobić? Utknąłem.. Nawet po tym co napisałeś nie mogę znaleźć błędu weź mi go wskaż.. Może mam zbyt ograniczone myślenie ale założenie to:

1) Wczytać linię 'tekstu' z klawiatury do zmiennej linia.

2) Wywołać metodę kalkulator w której podaje jej tą zmienną.

3) W metodzie kalkulator pobieram kolejne tokeny ze zmiennej i coś z nimi robię i wyrzucam wynik.

4) w metodzie setLine() w wywołaniu metody znajduje się liczba którą wyświetlam na ekranie

Poprawiłbyś ten kod proszę? Najgorsze jest to że te wasze zagadki i naprowadzenia wgl nie są dla mnie jasne.. Nie widzę tego błędu ;(((
komentarz 15 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Tak jak już pisali na tym drugim forum, funkcja kalkulator powinna tylko przetworzyć dane i zwrócić wynik. W przypadku błędu powinna wyrzucić wyjątek. Obsługa tego wyjątku w tej funkcji jest zbędna.

Podobne pytania

0 głosów
1 odpowiedź 74 wizyt
pytanie zadane 9 lipca w Java przez magicznyukf Początkujący (260 p.)
0 głosów
1 odpowiedź 72 wizyt
pytanie zadane 4 lutego w Java przez mn130496 Gaduła (3,080 p.)
0 głosów
2 odpowiedzi 68 wizyt
pytanie zadane 28 listopada 2018 w PHP, Symfony, Zend przez Raptor Mądrala (6,280 p.)
Porady nie od parady
Forum posiada swój własny serwer Discord, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

67,116 zapytań

114,063 odpowiedzi

241,764 komentarzy

47,028 pasjonatów

Przeglądających: 192
Pasjonatów: 11 Gości: 181

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...