Skocz do zawartości
  • 0

Zatrzymanie programu po wykonaniu operacji.


Pytanie

No cześć, postanowiłem przejść na zwykłą jave, no i pierwszy program - system biletów na basenie, wszystko działa, ale pojawia się problem kiedy wywołam funkcje od stworzenia nowego obiektu (Usera - klient basenu) to program się stopuje, a załóżmy, że chce stworzyć kilka obiektów, po czym wywołać komendę, np. "lista", która zwróci mi aktualnych klientów. Tak wiem wytłumaczone chaotycznie, ale myślę, że kod pomoże.

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        if(scanner.nextLine().equals("dodaj")){
            System.out.println("Podaj czas waznego biletu w minutach.");
            long time = scanner.nextLong() * 60 * 1000;
            User user = new User(UserUtil.getID(), System.currentTimeMillis(), time);
            InformationMessage.send(user);
            //tutaj ma program cofać się do początku, abym mógł znowu wykonać, np. komende "dodaj", a nie się stopować.
        }
    }
}

I ss: https://imgur.com/a/VHgKEf9

Edytowane przez KrejzolekPRO
Odnośnik do komentarza
https://skript.pl/temat/27036-zatrzymanie-programu-po-wykonaniu-operacji/
Udostępnij na innych stronach

8 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
16 minut temu, TheMolkaPL napisał:

Musisz sobie po prostu czytanie zapętlić w nieskończoną pętlę ;)

Niby działa, ale nie do końca, bo co prawda nie stopuje, ale po wykonaniu jakiejkolwiek "komendy" to trzeba ją wpisywać niekiedy dwa razy.

package com.company;

import com.company.messages.InformationMessage;
import com.company.messages.MainMessageUtil;
import com.company.objects.User;
import com.company.objects.UserUtil;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        boolean xyz = true;
        Scanner scanner = new Scanner(System.in);
        while(xyz) {
            if (scanner.nextLine().equals("dodaj")) {
                MainMessageUtil.send("Podaj czas waznego biletu w minutach.");
                long time = scanner.nextLong() * 60 * 1000;
                User user = new User(UserUtil.getID(), System.currentTimeMillis(), time);
                InformationMessage.send(user);
            }
            if(scanner.nextLine().equals("lista")){
                MainMessageUtil.send("Wybierz tryb sortowania. (all, id)");
                if(scanner.nextLine().equals("all")){
                    for(User user : UserUtil.userList){
                        InformationMessage.send(user);
                    }
                } else if(scanner.nextLine().equals("id")) {
                    MainMessageUtil.send("Podaj id klienta.");
                    int id = scanner.nextInt();
                    if (UserUtil.getUserById(id) != null) {
                        InformationMessage.send(UserUtil.getUserById(id));
                    } else {
                        MainMessageUtil.send("Klient o takim ID nie istnieje.");
                    }
                }
            }
        }
    }
}

Konsola: https://imgur.com/a/VHgKEf9

Odnośnik do komentarza
https://skript.pl/temat/27036-zatrzymanie-programu-po-wykonaniu-operacji/#findComment-178086
Udostępnij na innych stronach

  • 0
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
    String input = scanner.nextLine();
    switch (input.toLowerCase) {
        case "dodaj": // ...
    }
}

 

Odnośnik do komentarza
https://skript.pl/temat/27036-zatrzymanie-programu-po-wykonaniu-operacji/#findComment-178088
Udostępnij na innych stronach

  • 0

lel czemu nie

while(true){
}
?

 

@yooniks można to zapisać na wiele sposobów, is można zamienić na string składając chary itd i dalej będzie działać ale w sumie molki jest lepszy

Edytowane przez LloydPL
Odnośnik do komentarza
https://skript.pl/temat/27036-zatrzymanie-programu-po-wykonaniu-operacji/#findComment-178180
Udostępnij na innych stronach

  • 0
4 minuty temu, LloydPL napisał:

lel czemu nie

while(true){
}
?

Bo poprawnie sie robi tak jak napisal molka :cool:

https://docs.oracle.com/javase/tutorial/essential/io/scanning.html

Odnośnik do komentarza
https://skript.pl/temat/27036-zatrzymanie-programu-po-wykonaniu-operacji/#findComment-178181
Udostępnij na innych stronach

  • 0

Dzięki wszystkim, a w szczególności Molkowi! Ty zawsze pomożesz :)

Teraz to o wiele lepiej wygląda https://imgur.com/a/fYzq50g

Edytowane przez KrejzolekPRO
Odnośnik do komentarza
https://skript.pl/temat/27036-zatrzymanie-programu-po-wykonaniu-operacji/#findComment-178190
Udostępnij na innych stronach

  • 0
2 minuty temu, KrejzolekPRO napisał:

Dzięki wszystkim, a w szczególności Molkowi! Ty zawsze pomożesz :)

Teraz to o wiele lepiej wygląda https://imgur.com/a/fYzq50g

Jeszcze musisz się przede wszystkim nauczyć czym jest hermetyzacja i dlaczego jest bardzo ważna. Obiektowe programowanie, czyli najlepiej żadnych gloalnych zmiennych w kodzie (może być jedynie kilka wyjątków). W L28 wysyłasz informację o stworzeniu biletu, a go nigdzie nie przechowujesz co prowadzi do tego, że za chwilę GC Javy i tak go usunie z pamięci.

Nie ma nigdy takiego package jak... object(s), manager(s), data, etc. Są one zbyt generalne, ponieważ klasy lokalizuje się w package związanym z jego dziedziną/tematyką; a nie typem klasy, bo to utopia (nieintuicyjne i praktycznie nieskończona ilość klas).

Widzę, też (linijka L12), że nie znasz przeznaczenia i czym jest klasa utility (inaczej helper). Klasa utility (w Javie oraz Google Guava nazywana od swoje przeznaczenia z końcówką -s, np Arrays, Collections, Maps, Lists, w Apache Commons Lang z sufiksem -Utils, np RandomUtils, StringUtils, NumberUtils) to klasa która rozszerza funkcjonalność już istniejącej klasy w sytuacji gdy nie mamy możliwości jej edycji lub na niej wpływu. W związku z tym klasa utility nie dziedziczy po tej klasie, a jedynie dodaje globalne (inaczej statyczne) metody dodatkowe dla danej klasy. W związku z powyższym takiej klasy nie można instantyzować (tworzyć nowych instancji - obiektów); klasa taka powinna być finalna oraz posiadać prywatny konstruktor. Problem klasy utility jest taki, że tak jak nazwa wskazuje, posiada jedynie globalne metody oraz nie ma instancji co prowadzi to tego, że nie można na nią wpływać w żaden sposób z zewnątrz poprzez na przykład nadpisanie takiej metody i zmianę jej zachowania. Klasa TicketUtil jest więc zbędna, bo wszelkie jej metody powinny znajdować się w Ticket umożliwiając jej ewentualne nadpisanie.

Dodatkowo poczytaj sobie o zaletach, a przede wszystkim wadach wzorca singleton.

Odnośnik do komentarza
https://skript.pl/temat/27036-zatrzymanie-programu-po-wykonaniu-operacji/#findComment-178197
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...