Scanner - program się zawiesza

0

Ktoś może pomóc? I powiedzieć z jakiego powodu program się zawiesza i nie wypisuje nic co jest poniżej while'a ?

 
public class ONP {
    private Stack stosik;
    public ONP()
    {
        stosik = new Stack();
        Finished = false;
    }
    private Boolean Finished;
    public void Done()
    {
        Finished = true;
    }
    public Boolean IsDone()
    {
        return Finished;
    }
    public void Wrzuc(double elem)
    {
        stosik.push(elem);
    }
    public double Pobierz()
    {
        return (double)stosik.pop();
    }
}
public class JavaApplication1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        Scanner inek = new Scanner(System.in);
        ONP onpek = new ONP();
        while(inek.hasNext())
        {
            if(inek.hasNextDouble())
            {
                onpek.Wrzuc(inek.nextDouble());
            }
            else
            {
                switch(inek.next())
                {
                    case "+":
                        onpek.Wrzuc(onpek.Pobierz()+onpek.Pobierz());
                        break;
                    case "-":
                        onpek.Wrzuc(onpek.Pobierz()-onpek.Pobierz());
                        break;
                    case "*":
                        onpek.Wrzuc(onpek.Pobierz()*onpek.Pobierz());
                        break;
                    case "/":
                        onpek.Wrzuc(onpek.Pobierz()/onpek.Pobierz());
                        break;
                    default:
                        System.out.println("Blad w skladni!");
                        break;
                }
            }
        }
        System.out.println("blee");
    }
}
0

Scanner nie nadaje się do czytania z konsoli w pętli. Metoda hasNext() zawsze zwraca true.

0

to czego używać do czytania w pętli? JDK 1.7.0.

0

@bo: czemu zawsze zwraca true ? Przecież jak dasz koniec strumienia, to powinno zwrócić false :> Czy tu może działają inne prawa fizyki ? ;p

0
[losowa nazwa] napisał(a)

@bo: czemu zawsze zwraca true ? Przecież jak dasz koniec strumienia, to powinno zwrócić false :> Czy tu może działają inne prawa fizyki ? ;p

Małe niedomówienie, ale jaki szary user środowisk graficznych z konsolofobią wie że Ctrl+D to koniec strumienia wejściowego?

0

W takim wypadku nic nie nadaje się do czytania z konsoli, bo i tak strumień zawsze będzie się blokował i czekał na następną porcję.

0

Tak źle nie jest. Można użyć klasy Console

        Console con=System.console();
        while(true)
        {
            String line=con.readLine("");
            if(line.isEmpty())
            {
                break;
            }
            //obsługa odczytanej linii
        }

Można czytać znak po znaku

        do
        {
            try
            {
                i=System.in.read();
                //obsługa odczytanego i (jest typu int)
                if (i==ENTER)
                {
                    break;
                }
            }
            catch (IOException e)
            {
            }
        }
        while(true)
0
Scanner scanner = new Scanner(System.in);
String line;
while ((line = scanner.nextLine()) != null && !line.isEmpty()) {
    // obsługa odczytanej linii
}

Najlepiej jednak z góry założyć, jaki jest format wejścia / jaka sekwencja przerywa wczytywanie. Inaczej nie da się stwierdzić, gdzie jest koniec.

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