-1

J'ai créé une application Java Shopping Cart. J'ai utilisé la classe InputStreamReader pour cela. Mais son comportement étrange. J'ai déjà essayé la classe Scanner et la classe Data Input Stream. Mais ils ne semblent pas être en forme pour cette application.Quel est le problème avec InputStreamReader ici?

Quelqu'un peut-il s'il vous plaît signaler ce qui ne va pas avec cette classe?

Comme déjà mentionné, la classe Scanner et la classe DIS ont tendance à ignorer l'entrée de l'utilisateur, comme ici lors de l'utilisation de la classe ISR (voir Output: Rate). Je suis fatigué d'essayer toutes les classes d'utilitaires de saisie Java et de modifier mon code encore et encore.

import java.util.ArrayList; 
//import java.util.InputMismatchException; 
import java.util.Iterator; 
import java.util.Scanner; 
import java.io.DataInputStream; 
import java.io.InputStreamReader; 
import java.io.IOException; 
import java.lang.Throwable; 


public class NewShop { 


protected ArrayList<NewItem> ItemList; 
ArrayList<NewItem> cartList ; 

    // public DataInputStream dis = new DataInputStream(System.in); 
    // private Scanner sc = new Scanner(System.in); 
    private InputStreamReader isr = new InputStreamReader(System.in); 

public void addItem() { 

    long aCode = 0; 
    String aName =""; 
    double aRate = 0; 
    int aQuantity = 0; 
    NewItem foundItem; 

    System.out.println("Enter Item code:"); 
    /* try{ 
    String adddisString = dis.readLine();} 
     catch(IOException e){e.printStackTrace();} */ 

    try{ 
    aCode = isr.read(); 
     System.out.println("code entered is : " + aCode); 
     } 
     catch(IOException e){e.printStackTrace();} 

    foundItem = search(aCode); 
    if (foundItem == null) { 
     System.out.println("Item name : "); 
     try{ 
     aName = dis.readLine(); 
      } 
      catch(IOException e){e.printStackTrace();} 
     System.out.println("Rate : "); 
     try{ aRate = isr.read(); } 
      catch(IOException e){e.printStackTrace();} 

     System.out.println("Quantity : "); 
     try{aQuantity = isr.read();} 
     catch(IOException e){e.printStackTrace();} 


        NewItem aItem = new NewItem(aName, aRate, aCode, aQuantity); 
        ItemList.add(aItem); 
        } 
        else { 
        System.out.println("Item exists"); 
        } 


    } 

} 

Sortie:

[email protected]:~/NewJava$ java NewShoppingCart 
    New Shop for Items created. 
    -----ITEM------ 
1. Display all items 
2. Search items 
3. Add items to list 
4. Add items to cart 
5. Issue item 
6. Exit 
Choice: 
3 
Enter Item code: 
1 
code entered is : 49 
Item name : 
apple 
Rate : 
Quantity : 
30 
1. Display all items 
2. Search items 
3. Add items to list 
4. Add items to cart 
5. Issue item 
6. Exit 
Choice: 
1 
     code   name   rate   quantity 

     49   apple   10.0   51 

           ************ 
1. Display all items 
2. Search items 
3. Add items to list 
4. Add items to cart 
5. Issue item 
6. Exit 
Choice: 
+0

Quelle est votre sortie attendue? – procrastinator

+0

Pourriez-vous essayer de donner un peu plus de code et de fournir un [mcve] s'il vous plait? (avec quelques données) – AxelH

+0

Voir la section "Sortie". Je pense que la production attendue est certainement évidente. –

Répondre

2

InputStreamReader vous permet de lire un caractère de flux par caractère en utilisant read qui vous donne un int.

Ce int n'est pas la valeur d'une pensée, il est une représentation char d'un certain nombre, si

'0' = 48 
'1' = 49 
... 

Plus dans cette ASCII table

Ce que vous voulez probablement utiliser ici est un Scanner ce qui est plus simple dans votre cas ou un BufferedReader qui vous donne la possibilité d'obtenir la ligne complète dans un String.

Scanner sc = new Scanner(System.in); 
int i = sc.nextInt(); //This will get the next number an parse it in an integer (or throw an exception) 
//careful, the <ENTER> is still in the buffer, flush with sc.nextLine(); if needed 
sc.close(); 

La raison pour laquelle vous avez des entrées sautées en utilisant Scanner est au-dessus, lorsque vous lisez un type spécifique (comme readInt), la touche « Enter » est pas lu, il reste dans la mémoire tampon, le prochain appel de nextLine le lira. Vous devez effacer cette entrée avant de pouvoir obtenir la valeur correcte.

int i = sc.nextInt(); 
sc.nextLine(); //clear <enter> 
String s = sc.nextLine(); //next input 
+0

'Les lecteurs ne lisent pas" octet par octet "mais" char par char "... –

+0

@UsagiMiyamoto En effet, un personnage peut avoir plus d'un octet donc c'est mal dit! Merci. Corrigé – AxelH

+0

Besoin d'aide. Merci! Mais pouvez-vous s'il vous plaît jeter un peu de lumière sur l'endroit d'où at-il attribuer la valeur «10,0» à «Évaluer», même si elle n'a pas demandé la saisie de l'utilisateur? –

-1

Vous faites:

aCode = isr.read(); 

qui vous renvoie une Int valeur (voir Ascii-Table) du premier caractère que vous mettez dans Donc, pour le « 1. "vous mettez, vous obtiendrez le code Ascii de" 1 ", qui est 49.

Si vous voulez lire des chaînes avec InputStreamReader il peut être fait comme ceci:

InputStreamReader isr = new InputStreamReader(System.in) 
int c; 
String input = ""; 
while((c = isr.read()) != -1){ 
     input+= (char) c; 
} 

Mais vous obtiendrez de meilleurs résultats et plus facile si vous utilisez un scanner pour ce genre de choses, voir la réponse @AxelH pour cela.

+0

Et à propos de 'input: 30'? – AxelH

+0

Vous obtiendrez le premier caractère retourné comme Int, qui est "51" pour "3" – TheRealHypo

+0

C'est un problème ...;) – AxelH

1

Si vous utilisez Reader s vous devez convertir une valeur non-chaîne vous-même. DataInput s utilise le format binaire, ne convient pas à la saisie par l'utilisateur.

Ainsi votre solution la plus simple serait Scanner, alors essayez quelque chose comme ceci:

public class NewShop 
{ 
    protected ArrayList<NewItem> ItemList; 
    ArrayList<NewItem> cartList ; 
    private Scanner in = new Scanner(System.in); 
    public void addItem() 
    { 
    long aCode = 0; 
    String aName =""; 
    double aRate = 0; 
    int aQuantity = 0; 
    NewItem foundItem; 
    System.out.println("Enter Item code:"); 
    try 
    { 
     aCode = in.nextLong(); // this reads the to the first char that is not part of the 
     in.nextLine();   // long value, so we need to read till the end of the line... 
     System.out.println("code entered is : " + aCode); 
     foundItem = search(aCode); 
     if (foundItem == null) 
     { 
     System.out.println("Item name : "); 
     aName = in.nextLine(); 
     System.out.println("Rate : "); 
     aRate = in.nextDouble(); 
     in.nextLine(); 
     System.out.println("Quantity : "); 
     aQuantity = in.nextInt(); 
     in.nextLine(); 
     NewItem aItem = new NewItem(aName, aRate, aCode, aQuantity); 
     ItemList.add(aItem); 
     } 
     else 
     { 
     System.out.println("Item exists"); 
     } 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
} 

également supprimé les try-catch internes es comme si une valeur est fausse, il ne va pas travailler plus tard ...

+0

Oh, n'y a-t-il pas un commentaire sur le premier? –

+0

Eh bien, la "fin de la ligne" devrait être "début de la ligne suivante" ... –

+0

Dans un commentaire;) Je ne lis pas le code complet donc je ne peux pas le voir (surtout avec un gros code) mais Je suppose que ce serait suffisant pour les débutants. – AxelH