ubuntuusers.de

Java will den String nicht einlesen

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

313373n3wb33

Avatar von 313373n3wb33

Anmeldungsdatum:
7. November 2012

Beiträge: 71

Hallo Zusammen.

Hier der Code.

In dem if wird einer meiner Scanner nicht verwendet und der String nicht definiert. Ich habe den String jetzt blind genennt, damit der nächste Wert eingelesen wird. Eigentlich bring der String blind nix aber er muss drinen sein damit ich eine Streckeneinheit einlesen kann.

Ihr könnt ihn wegkommentieren o.ä. aber funktionieren tuts dann nicht mehr.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.Scanner;

public class Physiktest
{
    public static void main(String[]args)
    {
        Scanner input = new Scanner(System.in);
        System.out.println("Welchen Physikalischen Wert suchen sie?");
        String Gesucht = input.nextLine();
        //Wenn v (Fomelzeichen der Geschwindigkeit) gesucht wird)
        if (Gesucht.equals("v")){
            //Einlesen der Zeiteinheit (Z.B Sekunden, s, h ,min, stunden oder irgendwas)
            System.out.print("Zeiteinheit: ");
            String Zeiteinheit = input.nextLine();
            //Einlesen des Zahlenwerts der Zeit. Wieviele Sekunden, Stunden o.ä. wurden gemoßen
            System.out.print("Zahlenwert der Zeit: ");
            int Zeit = input.nextInt();
            
            //Die Einheit der Strecke aussuchen (z.b. M, Meter, Kilometer usw.)
            //!!HILFE WARUM LÄSST MEIN PROGRAMM DAS EINLESEN DES 2TEN STRINGS INNERHALB DIESES
            //IF NICHT ZU ABER DAS DRITTE FUNKTIONIERT?
            //Anfangs wurde die Streckeneinheit nicht eingelesen aber der Zahlenwert der Strecke schon
            //Mit einfügen des "blind" Strings funktioniert wieder alles
            System.out.print("Streckeneinheit: ");
            String blind = input.nextLine();
            String Streckeneinheit = input.nextLine();
            //Wert der Streckeneinheit wird eingelesen
            System.out.print("Wert der Streckeneinheit: ");
            int Strecke = input.nextInt();
            
            //Die beiden Werte werden durch die Methode Geschwindigkeit geschossen
            System.out.print(Geschwindigkeit(Strecke,Zeit));
            //Hier kommt die Maßeinheit der Geschwindigkeit zustande.
            System.out.print( Streckeneinheit + "/" + Zeiteinheit);
            
        }
        else{
            //Falls eine Physikalische Einheit gesucht wird die ich noch nicht geschrieben habe.
            System.out.println("Error");
        }
    }
    public static int Geschwindigkeit(int s, int t)
    {
        //Formel zur Berechnung
        int v = s/t;
        //Geschwindigkeitswert wird zurückgegeben
        return v;
    }
}

Hoffe mir ist noch zu Helfen

MfG N3w

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

Was heißt denn "wurde nicht eingelesen"?

313373n3wb33

(Themenstarter)
Avatar von 313373n3wb33

Anmeldungsdatum:
7. November 2012

Beiträge: 71

Der String wird nach dem Start vom Benutzer eingegeben(Ich nenn den Vorgang einlesen weil ich es nicht besser weiß). Und da kommt gar nicht erst eine Abfrage. Ich habs jetzt so gemacht das ein sinnloser String nicht eingelesen wird und der sinnhafte String gleich danach dran kommt.

Der sinnlose wird übersprungen obwohl ich das nicht mal wollte und der Sinnhafte wird eingelesen.

Wäre der sinnlose String nicht da würde hald Stattdessen der sinnhafte nicht eingelesen werden.

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

Du liest in Zeile 17 nur einen int ein. Danach ist der Eingabestream aber ja noch nicht "leer". Das passiert bei Dir erst mit dem darauffolgenden input.readLine().

313373n3wb33

(Themenstarter)
Avatar von 313373n3wb33

Anmeldungsdatum:
7. November 2012

Beiträge: 71

Der sinnlose und sinnhafte String sind in Zeile 25 und 26. Von "String blind = input.nextLine();" ist die rede.

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

Zeile 25 ist eben so nicht sinnlos, weil Du vorher in Zeile 17 mit readInt() eben nicht die gesamte Benutzereingabe verarbeitest.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13176

313373n3wb33 schrieb:

Der sinnlose und sinnhafte String sind in Zeile 25 und 26. Von "String blind = input.nextLine();" ist die rede.

Du brauchst "blind" ja nicht zu deklarieren. scanner.nextLine() brauchst Du aber, da der scanner.nextInt() nur die Ziffern gelesen hat. Danach können aber noch Zeichen kommen und auf jeden Fall der Zeilenumbruch. So, wie xabbuh das schon erklärt hat.

Ciao

robert

313373n3wb33

(Themenstarter)
Avatar von 313373n3wb33

Anmeldungsdatum:
7. November 2012

Beiträge: 71

Wie soll ich denn das verstehen? Zeile 17 kann doch nichts mit 25 zusammenhängen ich hab in 17 ja nur gesagt er soll die Variable einlesen und nicht dass er den nächsten String blocken soll. auch bei der ausgabe von blind bleibt es einfach leer.

Irgendwie versteh ich glaub nicht was du meinst. Sry ☹

Edit: Hat jemand von euch den Korrekten Code dann kann ich das vielleicht sehen.

Gruß

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13176

313373n3wb33 schrieb:

Wie soll ich denn das verstehen? Zeile 17 kann doch nichts mit 25 zusammenhängen

Wieso nicht? Beide lesen doch aus dem selben Stream.

ich hab in 17 ja nur gesagt er soll die Variable einlesen und nicht dass er den nächsten String blocken soll. auch bei der ausgabe von blind bleibt es einfach leer.

Ja, weil "blind" nur einen Leerstring enthält. Stell Dir diese Eingaben vor:

| 1 | 2 | 3 | \n | f | o | o | \n |

nextInt() liest nur "123" aus dem Strom. Das nächste Zeichen ist der Zeilenumbruch. (Du musst i.d.R. "Enter" drücken, damit das Terminal die Eingabe an den Prozess weiter leitet.) Der wird erst mit dem nextLine() gelesen, so dass erst danach aus dem Strom die nächste Antwort gelesen werden kann ("foo" im Beispiel).

Irgendwie versteh ich glaub nicht was du meinst. Sry ☹

Beschäftige Dich doch mal mit IO im Java Tutorial auf der Oracle-Seite.

Ciao

robert

313373n3wb33

(Themenstarter)
Avatar von 313373n3wb33

Anmeldungsdatum:
7. November 2012

Beiträge: 71

Vergesst es ich frag jemanden aus meiner Klasse. Trotzdem Danke für den Versuch-.-

Und BTW. ich bin grad an ner Übung für I/O dran.

Gruß

EDIT: PS: Ich schreib dann die Lösung noch hier rein damit der Eintrag auch Vollständig ist. Wär super wenn ihr danach nochmal was kommentiert^^

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13176

313373n3wb33 schrieb:

Vergesst es ich frag jemanden aus meiner Klasse. Trotzdem Danke für den Versuch-.-

EDIT: PS: Ich schreib dann die Lösung noch hier rein damit der Eintrag auch Vollständig ist. Wär super wenn ihr danach nochmal was kommentiert^^

Und wieso genau sollten wir uns die Mühe machen, wenn Du auf das nicht eingehst, was wir bisher geschrieben haben, und lieber nach fertigem Code fragst?

Ciao

robert

313373n3wb33

(Themenstarter)
Avatar von 313373n3wb33

Anmeldungsdatum:
7. November 2012

Beiträge: 71

Versteht mich nicht falsch ich bin euch dankbar für eure Beiträge und ich glaub euch, dass ihrs drauf habt, aber ich hab keinen Plan was ihr meint. Ich bin nur bisschen angefressen weil ich s nicht verstehe.

Irgendwie kann ich mir einfach nichts aus dem machen was ihr mir hier erzählt habt. Hier mal meine Gedanken dazu was ich mir aus dem machen kann was ihr mir geschrieben habt bitte findet meinen Fehler :'(.

so etwas wie:

1)

Du liest in Zeile 17 nur einen int ein.

Logisch das will ich ja auch.

2)

Danach ist der Eingabestream noch nicht "leer".

Da versteh ich gar nix. Soll ich nen 1 sekunden Timeout einbauen oder hängt das von den Befehlen ab?

3)

Das passiert bei Dir erst mit dem darauffolgenden input.readLine().

also mit dem string blind readline leere ich den Eingabestream (Ich kann ihn ja gleich danach wieder verwenden für Streckeneinheit), aber dass ist doch noch weniger Hilfreich als unhilfreich, weil der stream bei der Stelle schon leer sein sollte und nicht erst geleert werden sollte. Entweder hab ich das falsch verstanden was ich ehender glaube oder es gibt einen befehl zum leeren des eingabestreams aber das würde wiederrum bedeuten das die bereits eingelesenen daten gelöscht würden AUSSER der Eingabe stream ist der Prozess der die Daten nimmt und sie in besagten speicher kopiert. In dem Fall wäre bei 2tens aber ein Timer wirklich die richtige lösung.

Ich seh den Vorgang so: Ich sag dem Java es soll den int kübel(Datentyp) hernehmen, Zeit draufschreiben(Variablename aussuchen) und einen Int-Wert vom Benutzer scannen(Wäre in diesem Fall logischerweise ne Zahl *Enter*=Befehl beendet). Und wenn ich den String Kübel verwenden will bekommen ich einen Kübel der gleichnützlich wie ne Luftgitarre ist. X.x

PS: Ich hab mir das mit variablendeklaration schon 2 mal durchgelesen aber komm auf nix gscheides. X.x Meine Quelle ist übrigens Java ist auch eine Insel von Christian Ullenbohm.

MfG N3w

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

313373n3wb33 schrieb:

2)

Danach ist der Eingabestream noch nicht "leer".

Da versteh ich gar nix. Soll ich nen 1 sekunden Timeout einbauen oder hängt das von den Befehlen ab?

Der Eingabestream ist deswegen nicht leer, weil Du nicht nur eine Zahl eingibst, sondern auch noch ein Newline (durch das Drücken der Entertaste).

Das passiert bei Dir erst mit dem darauffolgenden input.readLine().

also mit dem string blind readline leere ich den Eingabestream (Ich kann ihn ja gleich danach wieder verwenden für Streckeneinheit), aber dass ist doch noch weniger Hilfreich als unhilfreich, weil der stream bei der Stelle schon leer sein sollte und nicht erst geleert werden sollte.

Wie gesagt, der Stream ist vorher noch nicht leer. Lass Dir doch einfach die Länge von blind anzeigen (da sollte 1 herauskommen).

313373n3wb33

(Themenstarter)
Avatar von 313373n3wb33

Anmeldungsdatum:
7. November 2012

Beiträge: 71

1
System.out.println("Hier der blind Wert:" + blind + ":fertig");

Das Ergebnis im CMD: " Hier der blind Wert::fertig "

Also nicht mal ein leerzeichen.

Ich krieg grad da voll die Kriese ich sags euch. <(^^,)>

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

Sorry, das war mein Fehler. nextLine() liefert Dir nur den Rest der Zeile ohne das Zeilenendezeichen.

Es bleibt aber dabei, der Scanne bei Dir die Benutzereingabe mit nextInt() eben nur bis zur letzten Zahl verarbeitet, wozu der Zeilenumbruch eben nicht mehr gehört und Du die nächste Benutzereingabe erst verarbeiten kannst, wenn der Scanner auch das Zeilenendezeichen verarbeitet hat.

Antworten |