1

JTextFieldからintに変換すると、GUIプログラムがクラッシュします。同じ方法を使用したので、このコードセグメントを確認して、何が問題なのかを確認するのに役立ちます。

私がやること:

new JTextLabel l;

そこに何を取得します

String A = l.getText() >int i = Interger.parse(A);

コード:

btnAdd.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        int nr = Integer.parseInt(txtApt.getText());
        int nrP = Integer.parseInt(txtNrPips.getText());
        String owner = txtOwner.toString();
        Apartment a = new Apartment(nr, nrP, owner, false);
        Expense b = new Expense(Float.parseFloat(textWW.getText()), Float.parseFloat(textCW.getText()),
                Float.parseFloat(textGAS.getText()), Float.parseFloat(txtELEC.getText()), Float.parseFloat(textHEAT.getText()));
        ArrayList<Expense> l = new ArrayList<>();
        l.add(b);
        cont.addKeyWithList(a,l);
    }
});

スタック:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at gui.Gui$4.actionPerformed(Gui.java:195)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
4

3 に答える 3

5

問題は、1つ以上のJTextFieldが空のときにこのメソッドが呼び出され、「」をintに解析しようとするとエラーが発生することです。解決策は、これが発生した場合にこのメソッドが呼び出されないようにブロックすることです。たとえば、JTextFieldドキュメントに対してDocumentListenerを使用して、JTextFieldにテキストがあるかどうかを確認し、必要なすべてのテキストフィールドにテキストが表示されるまでJButtonを無効にしておくことができます。

また、上記で提案したようにtry / catchブロックを使用して、例外をトラップし、それらを適切に処理します。

btnAdd.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      try {
        int nr = Integer.parseInt(txtApt.getText());
        int nrP = Integer.parseInt(txtNrPips.getText());
        // ... etc ...
      } catch (NumberFormatException nfe) {
        // warn the user that the textfields are not parsing well.
      }
    }
});
于 2012-12-20T00:11:51.403 に答える
2

一部のテキスト フィールドに有効な数値コンテンツが含まれていないため、解析が滞っています。これを修正するには、データを事前にフィルタリングする必要があります。

float floatWW = MY_DEFAULT_VALUE;
boolean errorWW = false;
try {
  float floatWW = Float.parseFloat(textWW.getText());
} catch (NumberFormatException ex) {
  errorWW = true;
}

(各 parseFloat 呼び出しについても同様です)

次に、不適切な iuput が与えられたときに、エラーを表示するか、デフォルトをそのまま受け入れるかを決定できます。

于 2012-12-20T00:16:38.853 に答える
1

数値に変換できない文字列を変換すると、問題が発生します。例: 2 つの文字列変数があり、1 つは "3" で、もう 1 つは "3" です。後で、整数に変換しようとすると、NumberFormatException が発生します。

ここにも同じ問題が存在します。テキスト フィールドに値を指定しないと、空白になり、例外が発生します。

だから、例外を取り除くために。最初に getText() の値を null や空白にしないでください。その後、正規表現を適用して、アルファベットや特殊文字ではなく数字のみを受け入れることを確認します。

于 2012-12-20T02:18:54.687 に答える