3

このコードを実行する場合:

JTextField ansTxt;
...
ansTxt = new JTextField(5);
String aString = ansTxt.getText();
int aInt = Integer.parseInt(aString);

なぜこのエラーが発生するのですか?

スレッド"AWT-EventQueue-0"の例外java.lang.NumberFormatException:入力文字列の場合: ""

アップデート:

JTextField ansTxt;
ansTxt = new JTextField(5);

ansTxt.addKeyListener(new KeyAdapter() {
   public void keyReleased(KeyEvent e) {
    ansTxt = (JTextField) e.getSource();
    String aString = ansTxt.getText().trim();
    int aInt = Integer.parseInt(aString);
   }
}
4

5 に答える 5

3

JTextField コンストラクターの整数引数は、実際には列数の幅です。ドキュメントから:

public JTextField(int columns)

指定された列数で新しい空の TextField を構築します。デフォルトのモデルが作成され、初期文字列が null に設定されます。

で構築することにより、

ansTxt = new JTextField(5);

基本的に、空のテキスト フィールドが得られます (引数なしのコンストラクターを使用して作成した場合よりもわずかに幅が広くなります)。文字列「5」を含めたい場合は、次のように記述します

ansTxt = new JTextField("5");
更新: IIRC では、keyDown に対して 1 つのイベント、keyTyped に対して 1 つ、keyUp に対して 1 つのイベントを取得します。おそらく、テキストフィールドは keyDown イベントでまだ更新されていません。いずれにせよ、Integer.parseInt を
try { ... } catch (NumberFormatException e) { ... }
ユーザーは整数以外のものを書き込む可能性が非常に高いため、ブロックします。-->
于 2010-09-13T14:52:01.250 に答える
2

空の文字列をintとして解析しようとしていますが、これは機能しません。どのintを""として解析する必要がありますか?JTextFieldには、解析可能なテキストが必要です。

ansTxt.addKeyListener(new KeyAdapter() {
    public void keyReleased(KeyEvent e) {
        ansTxt = (JTextField) e.getSource();
        try {
            int aInt = Integer.parseInt(ansTxt.getText());
            //Do whatever you want with the int
        } catch(NumberFormatException nfe) {
            /*
             * handle the case where the textfield 
             * does not contain a number, e.g. show
             * a warning or change the background or 
             * whatever you see fit.
             */
        }
    }
}

KeyAdapter内にansTxtを設定することもおそらく良い考えではありません。これにはローカル変数を使用することをお勧めします。これにより、アダプタを匿名クラスではなく「実際の」クラスに簡単に移動できます。

于 2010-09-13T14:50:51.343 に答える
1

メソッドを使用しtrim()ます。

int m=Integer.parseInt(txtfield.getText().trim());  

このtrim()メソッドは、番号に付加されている文字列をすべて削除します。

于 2011-02-22T14:45:29.117 に答える
0

KeyEventを処理KeyAdapterする前に実行されます。ansText実際、それをまったく処理できe.consume()ないようにすることができます。ansTextしたがって、最初にキーを押して離したときは、ansText.getText()まだです""。そのため、初めて例外が発生します。テンキーを2回押すと、2回目は機能するはずです。

于 2010-09-13T17:17:56.280 に答える
0

プロジェクトに Apache の " commons Lang " ライブラリを導入してみてください。

int aInt = 0;
if(StringUtils.isNotBlank(aString) && StringUtils.isNumeric(aString) ){
    aInt = Integer.parseInt(aString);
}

編集:反対票を投じる理由がわかりません。JtextField は任意の文字列を取ります。キーを押すたびにテキスト フィールドがリッスンしている場合、数値以外の値 (空白を含む) が入力されるたびに NumberFormatException が生成されます。新しい値で何かを行う前に、数値かどうかを確認することをお勧めします。

edit2:以下のトーマスのコメントによると。この問題を解決するための try/catch と StringUtils の方法を比較するテストを実行しました。テストはそれぞれ 500 万回実行されました。try/catch の平均時間は 21 秒でした。StringUtils の平均時間は 8 秒でした。そのため、重い負荷に StringUtils を使用すると、かなり高速になります。コードの負荷が小さい場合、違いはほとんどまたはまったくわかりません。テストランは

try{
   result = Integer.parseInt(num);
}catch(NumberFormatException ex){
   result = -1;
}

if(StringUtils.isNotBlank(num) && StringUtils.isNumeric(num)){
   result = Integer.parseInt(num);
}else{
   result = -1;
}

if ステートメントのループでの最適化を回避するために、ループごとに 10 桁の新しいランダム文字列が生成されます。これにより、6 ~ 7 秒のオーバーヘッドが追加されました。

于 2010-09-13T14:59:35.853 に答える