Dziwne zachowanie programu w Javie.

0

Witam, dzisiaj postanowilem uczyc sie Javy no i naskrobalem taki o to kod :

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner; //klasa Scanner
import java.io.PrintWriter;  
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException {
        int liczbaSztuk=0;
        Scanner sztuki = new Scanner(System.in);
        String opis;
        PrintWriter zapis  = new PrintWriter("zamowienie.txt");        
        System.out.println("Ile sztuk zamierzasz sprzedac? : ");
        liczbaSztuk = sztuki.nextInt();
        System.out.println("Co zamierzasz sprzedac?: ");
        opis = sztuki.nextLine();
        zapis.print("Sprzedano "+opis+" w liczbie sztuk : "+liczbaSztuk);
        zapis.close();
        // TODO code application logic here
    }
}

Problem polega na tym, ze po pobraniu ileSztuk program konczy swoje dzialanie. Nie pobiera juz zadnej wartosci do opisu produktu..Mam nadzieje, ze nie trzeba do kazdej pobieranej wartosci z innego typu tworzyc nowego obiektu klasy Scanner?

0

Wpisałeś zapewne liczbę a potem enter. nextInt() wczytało liczbę a znak nowej linii został w buforze i wczytało go nextLine()

0

Scanner nadaje się do czytania z pliku lub ze Stringa, nie jest zbyt wygodny przy czytaniu z konsoli. Użyj raczej klasy Console.

2

Moim zdaniem najwygodniej to chyba czytać po jednej linii BufferedReaderem w pętli, a potem każdą linię (Stringa) opakowywać w obiekt Scanner (w środku pętli).

0

Czytanie tekstu wielowierszowego przy użyciu klasy Console

        Console con = System.console();
        String line;
        StringBuilder txt = new StringBuilder("");
        System.out.println("Napisz cokolwiek a potem nacisnij ENTER - pusty wiersz konczy wczytywanie (Console)\n");
        while(true)
        {
            line=con.readLine("");
            if(line.isEmpty())
            {
                break;
            }
            txt.append(line+"\n");
        }

Czytanie tekstu wielowierszowego przy użyciu klasy Scanner (wpierw musisz wyczyścić bufor, w konsekwencji jeśli użytkownik chce wpisać pusty tekst, to musi się domyślić, że trzeba nacisnąć Ctrl+Z (lub Ctrl+D).

        System.out.println("Napisz cokolwiek a potem nacisnij ENTER - pusty wiersz konczy wczytywanie (Scanner)\n");        
        Scanner sc = new Scanner(System.in);
        while((line = sc.nextLine()).isEmpty())
        {
        }
        txt = new StringBuilder(line+"\n");
        while(sc.hasNextLine())
        {
            line = sc.nextLine();
            if(line.isEmpty())
            {
                break;
            }
            txt.append(line+"\n");
        }
0

Czemu nie "czyścisz bufora" gdy korzystasz z Console? Względnie: czemu czyścisz gdy korzystasz ze Scannera?

Można mieć przecież globalnego Scannera, dokładnie tak samo jak jest globalna Console i opakować go w klasę, która udostepnia tylko takie metody jak Console. I wtedy będzie działać tak samo. Albo zamiast opakowywać, użyć Scannera tak jak trzeba bezpośrednio, co w jednoplikowym projekcie może mieć sens.

0

Bo z Console nie muszę, a ze Scannerem niekiedy trzeba.

0

No właśnie gdy korzystasz z Scanner(System.in) jak z Console to też nie musisz, a zaleta jest taka, że Scanner(System.in) działa zawsze, a System.console() zwraca nulla, jeżeli nie ma fizycznie konsoli. Z drugiej strony zaletą Console jest obecność metody readPassword(), chociaż w całym swoim życiu chyba jeszcze z niej nie skorzystałem : )

0

Jak nie muszę, skoro muszę (przy Scanner(System.in))? Console bywa niewygodna, bo System.console() zwraca null gdy się program uruchamia w IDE tworzącym własną konsolę (np. Eclipse).

0

W jakim przypadku musisz? Zakładając oczywiście, jak już pisałem w każdym poście w tym wątku, że na Scannerze opakowującym System.in wywołujemy tylko i wyłącznie readLine.

0

Nie pamiętam wszystkich sytuacji, na pewno jest tak, jeżeli przed utworzeniem Scannera było wywołanie System.in.read();

1 użytkowników online, w tym zalogowanych: 0, gości: 1