2013-02-06 2 views
-2

J'ai créé un programme Java qui convertira la décimale en binaire et vice versa. Je n'ai aucun problème avec ma décimale en binaire. Mais quand je binaire mon codé décimal je reçois les erreurs suivantes:Erreur d'exception dans Java

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
at java.lang.Integer.parseInt(Integer.java:470) 
at java.lang.Integer.parseInt(Integer.java:499) 
at converter.actionPerformed(converter.java:42) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
at java.awt.Component.processMouseEvent(Component.java:6382) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3275) 
at java.awt.Component.processEvent(Component.java:6147) 
at java.awt.Container.processEvent(Container.java:2083) 
at java.awt.Component.dispatchEventImpl(Component.java:4744) 
at java.awt.Container.dispatchEventImpl(Container.java:2141) 
at java.awt.Component.dispatchEvent(Component.java:4572) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4619) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4280) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4210) 
at java.awt.Container.dispatchEventImpl(Container.java:2127) 
at java.awt.Window.dispatchEventImpl(Window.java:2489) 
at java.awt.Component.dispatchEvent(Component.java:4572) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:704) 
at java.awt.EventQueue.access$400(EventQueue.java:82) 
at java.awt.EventQueue$2.run(EventQueue.java:663) 
at java.awt.EventQueue$2.run(EventQueue.java:661) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
at java.awt.EventQueue$3.run(EventQueue.java:677) 
at java.awt.EventQueue$3.run(EventQueue.java:675) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:674) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

Voici mon code:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class converter extends JFrame implements ActionListener { 

    JTextField txt1; 
    JTextField txt2; 
    JLabel lbl1; 
    JLabel lbl2; 
    JButton b1; 
    JButton b2; 

    public converter(){ 
     Container c = getContentPane(); 
     JPanel jp = new JPanel(); 
     c.add(jp); 
     jp.add(lbl1=new JLabel("Decimal: ")); 
     jp.add(txt1=new JTextField(10)); 
     jp.add(lbl2=new JLabel("Binary: ")); 
     jp.add(txt2=new JTextField(10)); 
     jp.add(b1=new JButton("Convert")); 
     jp.add(b2=new JButton("Clear")); 
     b1.addActionListener(this); 
     b2.addActionListener(this); 

    } 

    public static void main(String[] args) { 
     converter cvt = new converter(); 
     cvt.setResizable(false); 
     cvt.setVisible(true); 
     cvt.setSize(250,150); 
     cvt.setTitle("Decimal - Binary Converter"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 

     String num = txt1.getText(); 
     int i = Integer.parseInt(num); 
     if(txt1 != null && e.getSource() == b1){ 
      String z = Integer.toBinaryString(i); 
      txt2.setText(z); 
     } 
     else if(e.getSource() == b2){ 
      txt1.setText(""); 
      txt2.setText(""); 
     } 
     else if(txt2 != null && e.getSource() == b1){ 
      int x = Integer.parseInt(txt2.getText().trim(), 2); 
      txt1.setText(""+x); 
     } 
    } 

} 

Pouvez-vous indiquer ce qui est faux? Et quelle peut être sa solution.

Répondre

0

Vérifiez txt1 et txt2 valeur s'il s'agit d'un nombre ou non.

0

La première ligne de la trace indique qu'une erreur s'est produite lorsque votre programme tente de convertir une chaîne vide ("") en int. Si vous regardez plus loin la trace (sur la ligne 5), l'erreur se produit dans la méthode actionPerformed. En particulier, les lignes:

String num = txt1.getText(); 
int i = Integer.parseInt(num); 

Vous pourriez résoudre ce problème en vérifiant d'abord si la chaîne n'est pas vide avec:

if (num.length() < 1) 
    // tell user they must enter a number 
1

Vous n'avez pas encore la vérification des limites dans votre code. Aka, vous avez deux entrées de texte et une fonction « Convertir », mais la fonction est applicable pour toutes les combinaisons suivantes:

  • entrée décimal et entrée binaire sont tous les deux donnés
  • entrée décimal et entrée binaire sont tous les deux omis
  • entrée décimale est donnée, entrée binaire est omis
  • entrée décimale est omise, est donnée entrée binaire

Vous devez décider ce qu'il faut faire dans les quatre cas, puis procéder à y notre analyse correctement. Trois cas sur quatre sont assez simples à traiter - vous laissant avec une décision sur ce qu'il faut faire quand un utilisateur remplit à la fois les champs de saisie Décimal et Binaire puis frappe Convert (Je recommanderais d'afficher une boîte de dialogue d'erreur dans ce cas).

En l'état actuel, vous analysez votre champ de saisie décimal dans tous les cas, et lorsque sa ce champ vide laissé se traduit par:

Integer.parseInt("") 

Ce qui jette un NumberFormatException, comme prévu.


je gérer vos quatre scénarios possibles quelque chose comme ceci:

public static boolean isEmpty(final String str) { 
    return (str == null || str.trim().equals("")); 
} 

final String decimalInput = text1.getText(); 
final String binaryInput = text2.getText(); 

if(! isEmpty(decimalInput)) { 
    if(! isEmpty(binaryInput)) { 
     // Decimal input and Binary input are both given, show error 
    } else { 
     // Decimal input is given, Binary input is omitted, convert to binary 
    } 
} else { 
    if(isEmpty(binaryInput)) { 
     // Decimal input and Binary input are both omitted, show error 
    } else { 
     // Decimal input is omitted, Binary input is given, convert to decimal 
    } 
} 
+0

oh oui, que dois-je faire? –

+0

@ Ms.B - J'ai ajouté du pseudo-code (j'espère utile). – Perception

0

Quelques choses sautent à l'esprit.

Vous pouvez intercepter l'exception et afficher un message indiquant à l'utilisateur que la valeur saisie n'est pas valide. Vous devriez également obtenir le résultat du champ juste pour être sûr.

public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 

    try {  
     String num = txt1.getText().trim(); // <-- Trim the incoming value 
     int i = Integer.parseInt(num); 
     if(txt1 != null && e.getSource() == b1){ 
      String z = Integer.toBinaryString(i); 
      txt2.setText(z); 
     } 
     else if(e.getSource() == b2){ 
      txt1.setText(""); 
      txt2.setText(""); 
     } 
     // I'm not sure if this a logic error or not, but txt2 is text field... 
     // Did you think it was the text from the field?? 
     else if(txt2 != null && e.getSource() == b1){ 
      int x = Integer.parseInt(txt2.getText().trim(), 2); 
      txt1.setText(""+x); 
     } 
    } catch (NumberFormatException exp) { 
     // Display message... 
    } 
} 

L'autre consiste à utiliser un DocumentFilter pour empêcher l'utilisateur d'entrer des valeurs qui ne sont pas valides pour les champs.

Découvrez Text Component Features et examples

Mise à jour

Vous avez aussi des erreurs de logique ...

txt1 et txt2 ne sont jamais susceptibles d'être null, à moins que vous avez fait quelque chose d'horrible mauvais ...

Vous devriez vérifier pour voir quel bouton a été enfoncé à vous permettra de prendre une décision plus claire sur la façon de progresser.

Vous devez ensuite vérifier le texte des champs et décider quel chemin conversion vous voulez aller sur ...

try { 
    if (e.getSource() == b1) { 
     String dec = txt1.getText(); 
     String bin = txt2.getText(); 

     if (dec != null && dec.trim().length() > 0 && 
      bin != null && bin.trim().length() > 0) { 
      // Both fields are filled out?! 
     } else if (dec != null && dec.trim().length() > 0) { 
      String value = txt1.getText(); 
      int i = Integer.parseInt(dec); 
      String z = Integer.toBinaryString(i); 
      txt2.setText(z); 
     } else if (bin != null && bin.trim().length() > 0) { 
      int x = Integer.parseInt(bin, 2); 
      txt1.setText("" + x); 
     } 
    } else if (e.getSource() == b2) { 
     txt1.setText(""); 
     txt2.setText(""); 
    } 
} catch (NumberFormatException exp) { 
    exp.printStackTrace(); 
} 
+0

J'ai essayé ce code et l'erreur ne s'est pas affichée. Mais mon problème est que lorsque je saisis un nombre binaire dans mon champ txt2, txt1 n'affiche pas la valeur décimale. –

+0

Vous avez aussi quelques problèmes de logique (et mon 'try-catch' est un peu large) - check update – MadProgrammer