Variablen Abfangen von eingaben per java.util.Scanner und weiter Verarbeitung

Phoenyx

Neues Mitglied
Hallo,

ich möchte ein Programm schreiben welches mir verschiedene Consolen Eingaben abfängt und diese dann entsprechend verarbeitet.

(Bitte nicht auf den Aufbau achten, ich weis das ich vieles in eigene Klassen und Methoden auslagern sollte.)

Nun mein Problem:

Die ersten 3 Variablen werden per scanner richtig eingelesen und lassen sich weiter verarbeiten. Bei der Variable fmodel kommt aber keine Abfrage mehr und keine Verarbeitung. Was habe ich hier falsch gemacht?

Java:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package brafrechnergrundlagen;

import java.util.*;

/**
 *
 * @author Martin
 */
public class Hund {
    public static void main(String[] args) {
        
        String name,fmodel;
        int gewicht;
        double prozent,ergebnis;
        try (Scanner scanner = new Scanner(System.in)) {
            // Einlesen des Namens von der Console und ablegen in
            // der Variable name
            System.out.println("\nBitte den Namen des Hundes ein:");
            name = scanner.nextLine();
            // Einlesen des Alters von der Console und ablegen in
            // der variable age
            System.out.println("\nBitte gib das Gewicht des Hundes ein:");
            gewicht = scanner.nextInt();
            System.out.println("Dein Hund heist also: "+name );
            System.out.println("und wiegt: " +gewicht+"kg");
            // Einlesen der Prozente die gefüttert werden soll
            // in die Variable prozent
            System.out.println("\nBitte gib an wieviel Prozent du füttern möchtest:\n");
            prozent = scanner.nextDouble();
            System.out.println("Du möchtest deinem Hund also " +prozent +"% vom Körpergewicht füttern.");
            // Auswahl des Fütterungsmodells
            System.out.println("Bitte entscheide dich für ein Fütterungsmodel.");
            System.out.println("Aktuell kannst du zwischen Prey und Swanie wählen.");
            fmodel = scanner.nextLine();
            switch (fmodel) {
                case "Prey":
                    System.out.println("Du hast dich für das Prey-Fütterungsmodel entschieden!");
                    break;
                case "Swanie":
                    System.out.println("Du hast dich für das Fütterungsmodel nach Swanie entschieden!");
                    break;
            }
            System.out.println("Das von dir angegebene Fütterungsmodel: " +fmodel +"ist noch nicht eingebaut");
            //Berechnen der Futtermenge
            ergebnis = ((double)gewicht) / 100 * prozent;
            System.out.println("Dies bedeutet dein Hund bekommt am Tag: " +ergebnis+"kg");
        }
    }
}
 
Java:
  try (Scanner scanner = new Scanner(System.in)) {.....}

Das ist Syntaktisch nicht korrekt, das mal vorab

richtig wäre :
Java:
try{
scanner = new Scanner(System.in);

}

Zudem wäre es erstens Sinnvoll das ganze Objekt Orientiert und nicht Prozedural zu Programmieren , zum anderen , könnte es durchaus sein das hier irgendwo ein Wert eingegeben wird , der eben nicht erwartet wird und somit eine Exception geworfen wird, die du aber so nicht nachvollziehen kannst da du hier keinen Catch Block definierst.

Ich hab es jetzt nur überflogen aber versuch mal das ganze in etwa so umzustrukturieren
(hier ohne Multicatch, welchen ich dir jedoch definitiv empfehle)

Prozedural:
Java:
try{

...
}
catch(Exception){
...
}

oder halt gleich Objekt-Orientiert und du erstellst dir eine klasse , welche methoden bietet die für das einlesen der Informationen, das bearbeiten, und verarbeiten zuständig sind, und erstellst davon jeweils nur Instanzen 😉
 
Zuletzt bearbeitet:
Doch ist richtig. Ist ein try-resource-block: HIER

Ist aber erst seit Java7 möglich.

Sah auf den ersten blick Syntaktisch nicht richtig aus, das Feature hab ich bis dato allerdings auch noch nicht verwenden müssen/ verwendet.

Mein Fehler 😉

Ändert aber nichts daran , das wenn er schon einen Try Block verwendet, dieser nix bringt wenn er dann evtl. geworfene Exceptions nicht auch behandelt/fängt ^^
 
Zuletzt bearbeitet:
Ah das bringt schon etwas, weil ja Scanner AutoCloseable implementiert und so den Stream nicht händisch schließen muss.
 
Ah das bringt schon etwas, weil ja Scanner AutoCloseable implementiert und so den Stream nicht händisch schließen muss.

Für sowas nutze ich für meinen Teil eigentlich immer eine Utilityklasse, die dann den Stream im finally/catch Block schließt, aber mag sein , ich hab mich wie gesagt mit der try-with-resources variante noch nicht weiter auseinander gesetzt 🙂
 
Zuletzt bearbeitet:
Vielen Dank für die bisherigen Antworten.

Richtig ist das ich hier Java 8 verwendet habe.

Auch richtig ist das ich noch keinen CatchBlock für Exception Handling eingebaut habe.

Leider helfen mir die Antworten bis jetzt noch nicht richtig weiter.

1. Ich vermute das mit der Aussage von

Ich hab es jetzt nur überflogen aber versuch mal das ganze in etwa so umzustrukturieren
(hier ohne Multicatch, welchen ich dir jedoch definitiv empfehle)

gemeint ist entweder alles in eigene Methoden / Klassen zu packen oder jeden Scanner lauf nach der Eingabe zu schließen und einen neuen zu öffnen wenn eine weitere Eingabe erwartet wird.

2. Und auf jedenfall ein ExceptionHandling einbauen sollte.

Ich muss hierzu erwähnen ich bin eher der Praktisch lernende Mensch. Alles was ich kann habe ich mir durch unzählige Wiederholungen beigebracht. Ich habe zwar auch ettliche Bücher gekauft und versucht zu lesen aber muss ganz ehrlich zugeben, das nachbauen von Beispielen bringt mir 10 mal mehr.

Wenn mir also vielleicht jemand an der ersten Eingabe mal ein Beispiel machen kann wäre ich echt dankbar.

Gruß und Danke schon mal

So ich habe nun mal noch ein bisschen rum probiert. Nun bekomme ich wenigstens eine Exception auch wenn ich gerade nichts damit anfangen kann.

Hier erstmal die Exception:
Exception in thread "main" java.util.NoSuchElementException
Aktuell kannst du zwischen Prey und Swanie wählen.
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at brafrechnergrundlagen.Hund.main(Hund.java:45)
Java Result: 1

Was am Code habe ich folgendes geändert:

Wie man in Zeile 27 sehe kann versuche ich es jetzt ohne nextLine() sonder nun mit next das funktioniert wieder für den ersten Teil auch sehr gut, den zweiten Teil in Zeile 45 zu sehen habe ich in einen neuen try block ausgelagert, leider brachte das nicht den gewünschten Erfolg.

Java:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package brafrechnergrundlagen;

import java.util.*;

/**
 *
 * @author Martin
 */
public class Hund {
    public static void main(String[] args) {
        
        String name;
        name = null;
        String fmodel;
        fmodel = null;
        int gewicht;
        double prozent,ergebnis;
        try (Scanner scanner = new Scanner(System.in)) {
            // Einlesen des Namens von der Console und ablegen in
            // der Variable name
            System.out.println("\nBitte den Namen des Hundes ein:");
            name = scanner.next();
            // Einlesen des Alters von der Console und ablegen in
            // der variable age
            System.out.println("\nBitte gib das Gewicht des Hundes ein:");
            gewicht = scanner.nextInt();
            System.out.println("Dein Hund heist also: "+name );
            System.out.println("und wiegt: " +gewicht+"kg");
            // Einlesen der Prozente die gefüttert werden soll
            // in die Variable prozent
            System.out.println("\nBitte gib an wieviel Prozent du füttern möchtest:\n");
            prozent = scanner.nextDouble();
            System.out.println("Du möchtest deinem Hund also " +prozent +"% vom Körpergewicht füttern.");
        }      

        // Auswahl des Fütterungsmodells
        try (Scanner scanner1 = new Scanner(System.in)) {
            System.out.println("Bitte entscheide dich für ein Fütterungsmodel.");
            System.out.println("Aktuell kannst du zwischen Prey und Swanie wählen.");
            fmodel = scanner1.next();
            switch (fmodel) {
                case "Prey":
                    System.out.println("Du hast dich für das Prey-Fütterungsmodel entschieden!");
                    break;
                case "Swanie":
                    System.out.println("Du hast dich für das Fütterungsmodel nach Swanie entschieden!");
                    break;
            }
            System.out.println("Das von dir angegebene Fütterungsmodel: " +fmodel +"ist noch nicht eingebaut");
            //Berechnen der Futtermenge
            ergebnis = ((double)gewicht) / 100 * prozent;
            System.out.println("Dies bedeutet dein Hund bekommt am Tag: " +ergebnis+"kg");
        }
    }
}
 
Zuletzt bearbeitet:
Also ich kann dir sagen, warum das nicht funktioniert.

Du musst entweder dein try-with-resource-block über die ganze main Methode hängen oder du lässt sie weg. Wenn der erste Block fertig ist, wird der Scanner und der darunterliegende Stream (in dem Fall System.in) geschlossen. Dieser kann nach Schließung nicht mehr geöffnet werden außer bei der JVM neustart. In der Regel schließt man System.in nicht genau sowenig wie die anderen Standard Ausgaben (System.out, System.err).

Java:
import java.util.Scanner;

public class Hund {
  public static void main(String[] args) {
    String name = null;
    String fmodel = null;
    int gewicht;
    double prozent, ergebnis;
    try (Scanner scanner = new Scanner(System.in)) {
      System.out.println("\nBitte den Namen des Hundes ein:");
      name = scanner.next();
      System.out.println("\nBitte gib das Gewicht des Hundes ein:");
      gewicht = scanner.nextInt();
      System.out.println("Dein Hund heist also: " + name);
      System.out.println("und wiegt: " + gewicht + "kg");
      System.out.println("\nBitte gib an wieviel Prozent du füttern möchtest:\n");
      prozent = scanner.nextDouble();
      System.out.println("Du möchtest deinem Hund also " + prozent + "% vom Körpergewicht füttern.");
      System.out.println("Bitte entscheide dich für ein Fütterungsmodel.");
      System.out.println("Aktuell kannst du zwischen Prey und Swanie wählen.");
      fmodel = scanner.next();
      switch (fmodel) {
        case "Prey":
          System.out.println("Du hast dich für das Prey-Fütterungsmodel entschieden!");
        break;
        case "Swanie":
          System.out.println("Du hast dich für das Fütterungsmodel nach Swanie entschieden!");
        break;
      }
      System.out.println("Das von dir angegebene Fütterungsmodel: " + fmodel + "ist noch nicht eingebaut");
      // Berechnen der Futtermenge
      ergebnis = (double) gewicht / 100 * prozent;
      System.out.println("Dies bedeutet dein Hund bekommt am Tag: " + ergebnis + "kg");
    }
  }
}

PS: Man schreibt wirklich nur Kommentare wo welche nötig sind. Wenn eine Zeile drüber beschreibt: "Liest das Gewicht ein", dann braucht man keinen Kommentar mit "Das Gewicht wird in diese Variable eingelesen" ... . Weil der Code hier schon selbsterklärend ist und die Variable dementsprechend heißt!
 
Zuletzt bearbeitet:

Zurück
Oben