2016-12-31 191 views
-1

我一直在寻找其他帖子的答案,他们似乎指向我在做什么,但我仍然得到NumberFormatException。我试图从JFrame通过拉jtextfield值并将其转换为int来构建一个简单的计算器,但我得到以下异常。将jtextfield转换为int的数字格式例外

package com.calculator.app; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class CalculatorApp extends JFrame { 

    private JPanel contentPane; 
    private JTextField textField = new JTextField(); 
    private JTextField textField_1 = new JTextField(); 
    private JTextField textField_2 = new JTextField(); 
    int num1 = Integer.parseInt(textField.getText()); 
    int num2 = Integer.parseInt(textField_1.getText()); 
    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        CalculatorApp frame = new CalculatorApp(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public CalculatorApp() { 

    // int num2 = Integer.parseInt(value2);  

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JLabel lblCalculatorApp = new JLabel("Calculator App"); 
     lblCalculatorApp.setBounds(141, 37, 138, 23); 
     contentPane.add(lblCalculatorApp); 

     JButton btnNewButton = new JButton("Add"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 

      } 
     }); 
     btnNewButton.setBounds(74, 112, 131, 31); 
     contentPane.add(btnNewButton); 

     JLabel lblNewLabel = new JLabel(""); 
     lblNewLabel.setBounds(169, 181, 82, 23); 
     contentPane.add(lblNewLabel); 

     textField = new JTextField(); 
     textField.setBounds(55, 73, 54, 23); 
     contentPane.add(textField); 
     textField.setColumns(10); 

     textField_1 = new JTextField(); 
     textField_1.setColumns(10); 
     textField_1.setBounds(151, 70, 54, 23); 
     contentPane.add(textField_1); 

     textField_2 = new JTextField(); 
     textField_2.setColumns(10); 
     textField_2.setBounds(109, 162, 124, 55); 
     contentPane.add(textField_2); 
    // textField_2.setText(String.valueOf(output)); 
     try{ 

      int output = Integer.parseInt(textField.getText()); 
       } 
       catch(NumberFormatException e){ 
        System.out.println("Error");  
       } 

    } 
} 

异常

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 com.calculator.ap.CalculatorApp.<init>(CalculatorApp.java:23) 
    at com.calculator.ap.CalculatorApp$1.run(CalculatorApp.java:32) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$500(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$JavaSecurityAccessImpl.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) 
+1

发布异常详细信息,但可能this'Integer.parseInt(textField.getText());'有问题,因为这个'extField。的getText()'是不是给你正确的格式化整数 –

+0

我张贴例外上面 – user6680

+0

不能解析一个空字符串为一个数字,字符串值必须包含数字只为解析成功 – Dummy

回答

5

这条线:

int num1 = Integer.parseInt(textField.getText()); 

相当于

int num1 = Integer.parseInt(""); 

,因为你没有在该行特定的值初始化textField

private JTextField textField = new JTextField(); 

所以,你正在试图解析一个空字符串作为整数,但它抛出NumberFormatException,因为它不是一个整数。

如果你只是想获得对这些问题,你可以把3个整数有:

private JTextField textField = new JTextField("1"); 
private JTextField textField_1 = new JTextField("2"); 
private JTextField textField_2 = new JTextField("3"); 

或(更好的),你可以删除下列行,因为它似乎你需要在以后对其进行解析(当按钮被点击):

int num1 = Integer.parseInt(textField.getText()); 
int num2 = Integer.parseInt(textField_1.getText()); 

上面的解释可以帮助你避免例外。

但是,如果你要总结这些数字,你应该填写此方法的主体:

btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      String text1 = textField.getText(); 
      String text2 = textField_1.getText(); 
      textField_2.setText(getIntegerValue(text1) + getIntegerValue(text2) + ""); 
     } 
    }); 

其中getIntegerValue可以是这样的:

private int getIntegerValue(String s) { 
    if ("".equals(s)) { 
     return 0; 
    } 
    return Integer.parseInt(s); 
} 

或更短:

private int getIntegerValue(String s) { 
    return "".equals(s) ? 0 : Integer.parseInt(s); 
} 

此方法:

  • 返回0如果字符串是空的(没有值)
  • 如果字符串表示整数
  • 抛出NumberFormatException如果字符串不是整数或空字符串
  • 不需要返回整数抓NumberFormatException,因为它是一个RuntimeException

当然,你可以,如果你想扔从最后的方法去除if /三元运算符即使字符串为空也是一个例外。

+0

感谢。这似乎工作。所以没有任何内置的,我可以不写我自己喜欢你getIntegerValue没有得到这个工作使用的方法呢? – user6680

+0

我不知道另一种方法。如果您想停止某些输入的异常,我认为您应该在纯Java中手动执行此操作(不使用外部库)。现在,根据您的需要,您可以在之前验证输入(最终使用正则表达式)。 –