Java 从Jtextfield输入解析Double/Int

Java 从Jtextfield输入解析Double/Int,java,parsing,try-catch,jtextfield,numberformatexception,Java,Parsing,Try Catch,Jtextfield,Numberformatexception,我是Java新手,现在尝试创建一个程序,使用JTextfield从用户那里接收值,并使用该值执行一些计算。我遇到了一个问题,JTextfield将出现NumberFormatException错误 当我试图编译它的时候。这是我的密码: import javax.swing.*; import java.lang.*; public class VehicleParking { public static void main(String args[]) { JTextField

我是Java新手,现在尝试创建一个程序,使用
JTextfield
从用户那里接收值,并使用该值执行一些计算。我遇到了一个问题,
JTextfield
将出现
NumberFormatException
错误 当我试图编译它的时候。这是我的密码:

import javax.swing.*;
import java.lang.*;
public class VehicleParking {
   public static void main(String args[]) {
      JTextField inh = new JTextField(2);
      JTextField inm = new JTextField(2);
      JTextField outh = new JTextField(2);
      JTextField outm = new JTextField(2);

      JPanel InPanel = new JPanel();
      InPanel.add(new JLabel("In Hours: "));
      InPanel.add(inh);
      String inhour = inh.getText();
      double inhourInput = Double.valueOf(inhour);
      InPanel.add(Box.createHorizontalStrut(15));
      InPanel.add(new JLabel("Minutes :"));
      InPanel.add(inm);
      String inminute = inm.getText();
      double inminuteInput = Double.valueOf(inminute);

      JPanel OutPanel = new JPanel();


      OutPanel.add(new JLabel("Out Hours: "));
      OutPanel.add(outh);
      String outhour = outh.getText();
      double outhourInput = Double.valueOf(outhour);
      OutPanel.add(Box.createHorizontalStrut(15));
      OutPanel.add(new JLabel("Minutes :"));
      OutPanel.add(outm);
      String outminute = outm.getText();
      double outminuteInput = Double.valueOf(outminute);
下面是我在编译它时得到的结果:

Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at java.lang.Double.valueOf(Double.java:502)
    at VehicleParking.main(VehicleParking.java:23)
底部还有更多用于显示和计算的内容。 另外,我也尝试过使用try-and-catch,但它根本解决不了我的问题。(出现了更多的错误。)这是我使用try-and-catch解决数字格式异常问题后的完整程序。(我知道对于这样简单的算术程序来说,不知怎的太长了。对不起。)

import javax.swing.*;
导入java.lang.*;
公营停车场{
公共静态void main(字符串参数[]){
JTextField inh=新的JTextField(2);
JTextField inm=新的JTextField(2);
JTextField outh=新的JTextField(2);
JTextField outm=新的JTextField(2);
JPanel InPanel=新的JPanel();
在面板中添加(新的JLabel(“小时:”);
在面板上添加(inh);
在面板中添加(框。创建水平支柱(15));
在面板中添加(新的JLabel(“分钟:”);
InPanel.add(inm);
JPanel OutPanel=新的JPanel();
OutPanel.add(新JLabel(“Out Hours:”);
输出板添加(outh);
输出板添加(框创建水平支柱(15));
添加(新的JLabel(“分钟”);
输出板添加(outm);
int choice=JOptionPane.showConfirmDialog(null,在面板中,“车辆停车系统”,JOptionPane.OK\u CANCEL\u选项);
if(choice==JOptionPane.OK\u选项)
{
尝试
{String inhour=inh.getText();
double-inhourInput=double.valueOf(inhour);}
捕获(数字格式){
if(inhour==null | | inhour.equals(“”)
{inhourInput=0.0;}
其他的
{inhourInput=0.0;}}
尝试
{String inminute=inm.getText();
double in分钟输入=double.valueOf(in分钟);}
捕获(数字格式){
if(inminute==null | | inminute.equals(“”)
{inminuteInput=0.0;}
其他的
{inminuteInput=0.0;}
int choice2=JOptionPane.showConfirmDialog(空,输出面板,“车辆停车系统”,JOptionPane.OK\u取消\u选项);
if(choice2==JOptionPane.OK\u选项)
{
尝试
{String outhour=outh.getText();
double outhourInput=double.valueOf(outhour);}
捕获(数字格式){
if(outhour==null | | outhour.equals(“”)
{outhourInput=0.0;}
其他的
{outhourInput=0.0;}}
尝试
{String outminute=outm.getText();
double outminuteInput=double.valueOf(outminute);}
捕获(数字格式){
if(outminute==null | | outminute.equals(“”)
{outminuteInput=0.0;}
其他的
{outminuteInput=0.0;}}
双小时=输出-输入;
双分钟=输出分钟输入-输入分钟输入;
字符串[]VehicleType={“汽车”、“货车”、“公共汽车”、“卡车”};
字符串类型vehicle=(字符串)JOptionPane.showInputDialog(null,“选择车辆类型:”,“车辆停车系统”,JOptionPane.PLAIN_消息,
null,VehicleType,VehicleType[0]);
开关(类型车辆)

{case“Car”:在第一个示例中,如果(分钟出现导致问题的行是:

double outhourInput = Double.valueOf(outhour);
引用的异常跟踪表明outhour为空/null。因此,在转换之前,请检查outhour是否为空(例如,
outhour!=null&&!outhour.trim().isEmpty()

将代码(第二个示例中的代码)复制到IDE后,问题很快就清楚了。NumberFormatException本身没有问题。问题存在于多个地方,是变量的范围问题

       if (choice == JOptionPane.OK_OPTION) {
        try {
            String inhour = inh.getText();  //-->inhour defined here
            double inhourInput = Double.valueOf(inhour);
        }
        catch (NumberFormatException e) {
            if (inhour == null || inhour.equals("")) {  //-->no scope for inhour
                inhourInput = 0.0;
            }
            else {
                inhourInput = 0.0;
            }
        }
在所有块中,必须确保定义的变量在catch块中的作用域内。但是,我看不到if测试的意义,因为它们都将变量设置为0.0

尝试以下方法:

double inhourInput = 0.0;
String inhour = inh.getText();
try {
   inhour = inh.getText();
   inhourInput = Double.valueOf(inhour);
}
catch (NumberFormatException e) {
  // do not really need to reset to 0, but can be useful for clarity
  inhoutInput = 0.0;
}

我只是想澄清一下,你在编译时收到了一个错误?在什么行号?我编辑了这篇文章,其他结果表明我在编译时收到了异常错误,而没有使用try-and-catch方法。好的,如果你解决了变量的作用域问题,try/catch方法的较低示例更好。你应该ys尝试捕获数字异常。这对我来说是一个很好的解决方案。它完全解决了我的问题。非常感谢!虽然我收到了一个关于“inhour”声明两次的小错误。但是它可以很容易地解决。再次感谢!@LeonSeveron,你是对的,我在
try中删除字符串声明失败{
当我移动东西时。进行了编辑。很高兴它有帮助。
double inhourInput = 0.0;
String inhour = inh.getText();
try {
   inhour = inh.getText();
   inhourInput = Double.valueOf(inhour);
}
catch (NumberFormatException e) {
  // do not really need to reset to 0, but can be useful for clarity
  inhoutInput = 0.0;
}