InputStreamReader Eingabeprozess abbrechen

Conax

Mitglied
Das ganze Projekt soll später mal einen Binärbaum/BinaryTree erzeugen und hierfür habe ich zuerst eine Eingabemöglichkeit geschaffen damit die Werte erst einmal in einer ArrayListe gespeichert werden. Wenn die Werteingabe abgeschlossen ist soll durch Eingabe des textes "no" der Eingabeprozess abgebrochen werden und anschließen zur Kontrolle die ArrayListe ausgegeben werden. Allerdings habe ich momentan das Problem das bei Eingabe von no immer in Eclipse eine Errormeldung ausgegeben wird. Hier also mal mein Code soweit:

Code:
import java.io.*;
import java.util.ArrayList;


public class Node
{
    //Input over keyboard
    static InputStreamReader input  = new InputStreamReader(System.in);
    //buffer for my input
    static BufferedReader keyboardInput = new BufferedReader(input);
    int rootvalue;
    boolean addingnodes = true;
    String nodevalue;
    ArrayList<Integer> nodevaluelist = new ArrayList<Integer>();
   
    public void dialog()
    {
        System.out.println("Please insert value of root node");
        try
        {
         rootvalue = Integer.parseInt(keyboardInput.readLine());
         nodevaluelist.add(rootvalue);
        }
        catch (IOException e) {}
       
        System.out.println("You can add another node value type 'no' when you are finished ");
        try
        {
         nodevalue = keyboardInput.readLine();
         //nodevaluelist.add(Integer.parseInt(nodevalue));
        }
        catch (IOException e){}
       
        do
        {
            if(nodevalue.equals("no"))
            {
                addingnodes = false;
                //is used for testing if input works fine
                System.out.println("values of my nodelist");
                for (Integer output : nodevaluelist)
                {
                    System.out.println(output);
                }
               
            }
            else
            {
                System.out.println("You can add another node value type 'no' when you are finished ");
                try
                {
                 nodevalue = keyboardInput.readLine();
                 nodevaluelist.add(Integer.parseInt(nodevalue));
                }
                catch (IOException e){}
            }
        }
        while(addingnodes == true);
    }
   
    public static void main(String[] args)
    {
        Node test = new Node();
        test.dialog();
    }
   
}

Ich hoffe jemand kann mir helfen. Danke.
 
Ich hab das jetzt mal kopiert mit den Beispieleingaben aus eclipse.

Code:
Please insert value of root node
5
You can add another node value type 'no' when you are finished
9
You can add another node value type 'no' when you are finished
12
You can add another node value type 'no' when you are finished
no
Exception in thread "main" java.lang.NumberFormatException: For input string: "no"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Node.dialog(Node.java:53)
    at Node.main(Node.java:64)
 
Wenn du "no" eingibst, schlägt natürlich der Versuch fehl, daraus einen int zu machen, und es kommt zu der besagten NumberFormatException. Da du diese Exception nicht fängst, sondern nur IOExceptions, crasht dein programm.
 
Ok ja hast recht das ist natürlich Müll. Ich hab jetzt versucht mit nem break vorher rauszuspringen damit er gar nicht mehr auf die Idee kommt das "no" in nen integer umzuwandeln aber irgendwie funktioniert das nicht so wie ich mir das gedacht habe.

Code:
while(addingnodes == true);
{
                System.out.println("You can add another node value type 'no' when you are finished ");
                try
                {
                 nodevalue = keyboardInput.readLine();
                 if(nodevalue.equals("no"))
                 {
                        addingnodes = false;
                        //is used for testing if input works fine
                        System.out.println("values of my nodelist");
                        for (Integer output : nodevaluelist)
                        {
                            System.out.println(output);
                        }
                        break;
                       
                 }
                 else
                 {
                  nodevaluelist.add(Integer.parseInt(nodevalue));
                 }
                }
       
                catch (IOException e){}
           
               
}
 
So habs jetzt selber hinbekommen. Wahrscheinlich haben sich hier einige schlapp gelacht bei meinem Unterfangen man hätte mir aber auch mal sagen können das sich für mein Vorhaben eher die Scanner Klasse eignet statt mit dem InputStreamReader rum zu hantieren. Dumm ist nur wenn man nach java Eingabemöglichkeiten sucht erstmal über den InputStreamReader stolpert(zumindest war das so bei meiner google suche). Auch wenn ich natürlich jetzt froh bin eine Lösung gefunden zu haben war das ganze natürlich total ineffizient weil ich Stunden verbracht hatte den Fehler zu suchen.

Hier mal der jetzt funktionierende Code.

Code:
import java.util.ArrayList;
import java.util.Scanner;

public class Node
{
   //Input over keyboard
  Scanner userinput = new Scanner(System.in);
   
  int rootvalue;
  boolean addingnodes = true;
  String nodevalue;
  ArrayList<Integer> nodevaluelist = new ArrayList<Integer>();
   
  public void dialog()
  {
     System.out.println("Please insert value of root node");
     
     rootvalue = Integer.parseInt(userinput.next());
     nodevaluelist.add(rootvalue);
     
     
      while(addingnodes == true)
      {
         System.out.println("You can add another node value type 'no' when you are finished ");
         nodevalue = userinput.next();
         
          if(nodevalue.equals("no"))
          {
             addingnodes = false;
             //is used for testing if input works fine
             System.out.println("values of my nodelist");
             for (Integer output : nodevaluelist)
             {
               System.out.println(output);
             }
             break;
          }
          else
          {
          nodevaluelist.add(Integer.parseInt(nodevalue));
          }
      }   
     }
   
   
   
  public static void main(String[] args)
  {
     Node test = new Node();
     test.dialog();
  }
   
}
 
Zuletzt bearbeitet:
Wenn dein Benutzer aber nun nach der Aufforderung: Please insert value of root node nicht auf dich hört und dort schon "no" eingibt schmeisst es dich immer noch !
 
Wahrscheinlich haben sich hier einige schlapp gelacht bei meinem Unterfangen man hätte mir aber auch mal sagen können das sich für mein Vorhaben eher die Scanner Klasse eignet statt mit dem InputStreamReader rum zu hantieren.
Na, höre ich da den leisen Hauch eines Vorwurfs? Solche Kommentare kannst du dir von mir aus sparen.
Deine Probleme haben nichts damit zu tun, dass du den falschen "Eingabetyp" gewählt hast, sondern sind eher logischer Natur.
Nach wie vor crasht den Programm, wenn der Benutzer eine Eingabe tätigt, die nicht in einen Int umgewandelt werden kann.
 
Danke für den Hinweis ich hab den Code jetzt nochmal angepasst. Ja mag sein das da der Frust gestern mich mit dazu verleitet hat. Ich bin grad dabei mir das ganze zu den Binärbäumen mal durchzulesen wenn jemand hier nen guten Link dazu hat würde ich mich sehr freuen.

Code:
import java.util.ArrayList;
import java.util.Scanner;

public class Node
{
    //Input over keyboard
    Scanner userinput = new Scanner(System.in);
   
    int rootvalue;
    boolean addingnodes = true;
    String nodevalue;
    ArrayList<Integer> nodevaluelist = new ArrayList<Integer>();
   
    public void dialog()
    {
        System.out.println("Please insert value of root node");
        try
        {
         rootvalue = Integer.parseInt(userinput.next());
        }
        catch (NumberFormatException e) {}
        nodevaluelist.add(rootvalue);
       
       
         while(addingnodes == true)
         {
                System.out.println("You can add another node value type 'no' when you are finished ");
                nodevalue = userinput.next();
               
                 if(nodevalue.equals("no"))
                 {
                        addingnodes = false;
                        //is used for testing if input works fine
                        System.out.println("values of my nodelist");
                        for (Integer output : nodevaluelist)
                        {
                            System.out.println(output);
                        }
                        break;
                 }
                 else
                 {
                  try
                  {
                   nodevaluelist.add(Integer.parseInt(nodevalue));
                  }
                  catch (NumberFormatException e) {}
                 }
             }   
        }
   
   
   
    public static void main(String[] args)
    {
        Node test = new Node();
        test.dialog();
    }
   
}
 

Zurück
Oben