-2

10 進数を 2 進数に、またはその逆に変換する Java プログラムを作成しました。10 進数から 2 進数への変換に問題はありません。しかし、バイナリを 10 進数にコーディングすると、次のエラーが発生します。

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)

これが私のコードです:

    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);
        }
    }

}

何が間違っているか指摘できますか?そして、その解決策は何ですか。

4

4 に答える 4

1

コードに境界チェックがありません。別名、2 つのテキスト入力と 1 つの「変換」機能がありますが、この機能は次のすべての組み合わせに適用できます。

  • 10 進入力と 2 進入力の両方が与えられます
  • 10進入力、2進入力ともに省略
  • 10進入力あり、2進入力省略
  • 10進入力省略、2進入力あり

4 つのケースすべてで何をすべきかを決定し、適切に解析を進める必要があります。これらのケースのうち 4 つのうち 3 つは、非常に簡単に対処できます。ユーザーが 10 進数と 2 進数の両方の入力フィールドに入力して [変換] をクリックした場合にどうするかを決定する必要があります (エラー ダイアログを表示することをお勧めします)。その場合)。

現状では、すべての場合に Decimal 入力フィールドを解析しており、空白のままにすると、次のように変換されます。

Integer.parseInt("")

予想どおり、これは をスローしNumberFormatExceptionます。


次のような4つの考えられるシナリオを処理します。

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
    }
}
于 2013-02-06T03:52:06.210 に答える
0

トレースの最初の行は、プログラムが空の文字列 ( "") をint. トレースのさらに下 (5 行目) を見ると、メソッドでエラーが発生していますactionPerformed。特に、次の行:

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

最初に文字列が空でないかどうかを次のようにチェックすることで、この問題を解決できます。

if (num.length() < 1)
  // tell user they must enter a number
于 2013-02-06T03:48:51.707 に答える
0

いくつかのことが思い浮かびます。

例外をトラップして、入力した値が無効であることをユーザーに知らせるメッセージを表示できます。trim念のため、フィールドからの結果も必要です。

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...
    }
}

もう 1 つは、 を使用しDocumentFilterて、ユーザーがフィールドに無効な値を入力できないようにすることです。

テキスト コンポーネントの機能を確認する

更新しました

また、いくつかの論理エラーがあります...

txt1あなたが何か恐ろしい間違ったことをしない限り、txt2そうなる可能性は決してありません...null

どのボタンが最初に押されたかを確認する必要があります。これにより、進行方法についてより明確な決定を下すことができます。

次に、フィールドのテキストを確認し、どのコンバージョン パスを使用するかを決定する必要があります...

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();
}
于 2013-02-06T03:54:28.570 に答える
0

数値かどうかを確認txt1して値を付けます。txt2

于 2013-02-06T03:46:14.887 に答える