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

wyjątki, pętle

VPS Starter Arubacloud
0 głosów
235 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,830 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 Ekspert (269,120 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 Ekspert (269,120 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 Ekspert (269,120 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ź 501 wizyt
pytanie zadane 9 lipca 2019 w Java przez magicznyukf Początkujący (260 p.)
0 głosów
1 odpowiedź 535 wizyt
pytanie zadane 4 lutego 2019 w Java przez mn130496 Gaduła (3,530 p.)
+1 głos
0 odpowiedzi 215 wizyt
pytanie zadane 2 listopada 2020 w C# przez XavRock Obywatel (1,390 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...