繁体   English   中英

从Jtextfield输入解析Double / Int

[英]Parsing Double/Int from Jtextfield Input

我是Java的新手,我现在正尝试创建一个程序,该程序使用JTextfield从用户那里接收值并使用该值执行一些计算。 我在尝试编译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尝试解决Number后的完整程序。格式异常问题。(我知道对于这种简单的算术程序来说,它太长了。抱歉。)

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);
      InPanel.add(Box.createHorizontalStrut(15));
      InPanel.add(new JLabel("Minutes :"));
      InPanel.add(inm);

      JPanel OutPanel = new JPanel();


      OutPanel.add(new JLabel("Out Hours: "));
      OutPanel.add(outh);
      OutPanel.add(Box.createHorizontalStrut(15));
      OutPanel.add(new JLabel("Minutes :"));
      OutPanel.add(outm);




      int choice = JOptionPane.showConfirmDialog(null, InPanel, "Vehicle Parking System",JOptionPane.OK_CANCEL_OPTION);
            if (choice == JOptionPane.OK_OPTION)
                {
                    try
                        {String inhour = inh.getText();
                        double inhourInput = Double.valueOf(inhour);}
                    catch (NumberFormatException e){
                        if (inhour == null || inhour.equals(""))
                            {inhourInput = 0.0;}
                        else
                            {inhourInput = 0.0;}}


                    try
                        {String inminute = inm.getText();
                        double inminuteInput = Double.valueOf(inminute);}
                    catch (NumberFormatException e){
                        if (inminute == null || inminute.equals(""))
                            {inminuteInput = 0.0;}
                        else
                            {inminuteInput = 0.0;}}

                    int choice2 = JOptionPane.showConfirmDialog(null, OutPanel, "Vehicle Parking System",JOptionPane.OK_CANCEL_OPTION);
                    if (choice2 == JOptionPane.OK_OPTION)
                        {
                            try
                                {String outhour = outh.getText();
                                double outhourInput = Double.valueOf(outhour);}
                            catch (NumberFormatException e){
                                if (outhour == null || outhour.equals(""))
                                    {outhourInput = 0.0;}
                                else
                                    {outhourInput = 0.0;}}

                            try
                                {String outminute = outm.getText();
                                double outminuteInput = Double.valueOf(outminute);}
                            catch (NumberFormatException e){
                                if (outminute == null || outminute.equals(""))
                                    {outminuteInput = 0.0;}
                                else
                                    {outminuteInput = 0.0;}}
                        double hour = outhourInput - inhourInput;
                        double minute = outminuteInput - inminuteInput;
                        String[] VehicleType = {"Car","Van","Bus","Lorry"};
                        String typeVehicle =(String)JOptionPane.showInputDialog (null, "Choose vehicle type: ","Vehicle Parking System",JOptionPane.PLAIN_MESSAGE,
                                                                                null,VehicleType,VehicleType[0]);
                        switch (typeVehicle)
                            {case "Car" :   if (minute <0)
                                                {minute = minute +60;
                                                hour = hour - 1;
                                                double calcalateDuration = hour + (minute/60);
                                                double fee = calcalateDuration;
                                                String show = "Parking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,show,"Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                JOptionPane.showMessageDialog(null,"Please take your receipt.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                String receipt =    "In time: "+inhourInput+" "+inminuteInput+
                                                                    "\nOut time: "+outhourInput+" "+inminuteInput+
                                                                    "\nDuration: "+hour+"hours and "+minute+"minutes."+
                                                                    "\nVehicle Type: "+typeVehicle+
                                                                    "\nParking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,receipt,"Vehicle Parking System - Parking Receipt",JOptionPane.INFORMATION_MESSAGE);}
                                            else
                                                {double calcalateDuration = hour + (minute/60);
                                                double fee = calcalateDuration;
                                                String show = "Parking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,show,"Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                JOptionPane.showMessageDialog(null,"Please take your receipt.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                String receipt =    "In time: "+inhourInput+" "+inminuteInput+
                                                                    "\nOut time: "+outhourInput+" "+inminuteInput+
                                                                    "\nDuration: "+hour+"hours and "+minute+"minutes."+
                                                                    "\nVehicle Type: "+typeVehicle+
                                                                    "\nParking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,receipt,"Vehicle Parking System - Parking Receipt",JOptionPane.INFORMATION_MESSAGE);}
                                            break;

                            case "Van"  :   if (minute <0)
                                                {minute = minute +60;
                                                hour = hour - 1;
                                                double calcalateDuration = hour + (minute/60);
                                                double fee = calcalateDuration*120/100;
                                                String show = "Parking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,show,"Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                JOptionPane.showMessageDialog(null,"Please take your receipt.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                String receipt =    "In time: "+inhourInput+" "+inminuteInput+
                                                                    "\nOut time: "+outhourInput+" "+inminuteInput+
                                                                    "\nDuration: "+hour+"hours and "+minute+"minutes."+
                                                                    "\nVehicle Type: "+typeVehicle+
                                                                    "\nParking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,receipt,"Vehicle Parking System - Parking Receipt",JOptionPane.INFORMATION_MESSAGE);}
                                            else
                                                {double calcalateDuration = hour + (minute/60);
                                                double fee = calcalateDuration*120/100;
                                                String show = "Parking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,show,"Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                JOptionPane.showMessageDialog(null,"Please take your receipt.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                String receipt =    "In time: "+inhourInput+" "+inminuteInput+
                                                                    "\nOut time: "+outhourInput+" "+inminuteInput+
                                                                    "\nDuration: "+hour+"hours and "+minute+"minutes."+
                                                                    "\nVehicle Type: "+typeVehicle+
                                                                    "\nParking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,receipt,"Vehicle Parking System - Parking Receipt",JOptionPane.INFORMATION_MESSAGE);}
                                            break;
                            case "Bus"  :   if (minute <0)
                                                {minute = minute +60;
                                                hour = hour - 1;
                                                double calcalateDuration = hour + (minute/60);
                                                double fee = calcalateDuration*140/100;
                                                String show = "Parking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,show,"Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                JOptionPane.showMessageDialog(null,"Please take your receipt.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                String receipt =    "In time: "+inhourInput+" "+inminuteInput+
                                                                    "\nOut time: "+outhourInput+" "+inminuteInput+
                                                                    "\nDuration: "+hour+"hours and "+minute+"minutes."+
                                                                    "\nVehicle Type: "+typeVehicle+
                                                                    "\nParking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,receipt,"Vehicle Parking System - Parking Receipt",JOptionPane.INFORMATION_MESSAGE);}
                                            else
                                                {double calcalateDuration = hour + (minute/60);
                                                double fee = calcalateDuration*140/100;
                                                String show = "Parking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,show,"Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                JOptionPane.showMessageDialog(null,"Please take your receipt.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                String receipt =    "In time: "+inhourInput+" "+inminuteInput+
                                                                    "\nOut time: "+outhourInput+" "+inminuteInput+
                                                                    "\nDuration: "+hour+"hours and "+minute+"minutes."+
                                                                    "\nVehicle Type: "+typeVehicle+
                                                                    "\nParking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,receipt,"Vehicle Parking System - Parking Receipt",JOptionPane.INFORMATION_MESSAGE);}
                                            break;

                            case "Lorry" :  if (minute <0)
                                                {minute = minute +60;
                                                hour = hour - 1;
                                                double calcalateDuration = hour + (minute/60);
                                                double fee = calcalateDuration*160/100;
                                                String show = "Parking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,show,"Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                JOptionPane.showMessageDialog(null,"Please take your receipt.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                String receipt =    "In time: "+inhourInput+" "+inminuteInput+
                                                                    "\nOut time: "+outhourInput+" "+inminuteInput+
                                                                    "\nDuration: "+hour+"hours and "+minute+"minutes."+
                                                                    "\nVehicle Type: "+typeVehicle+
                                                                    "\nParking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,receipt,"Vehicle Parking System - Parking Receipt",JOptionPane.INFORMATION_MESSAGE);}
                                            else
                                                {double calcalateDuration = hour + (minute/60);
                                                double fee = calcalateDuration*160/100;
                                                String show = "Parking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,show,"Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                JOptionPane.showMessageDialog(null,"Please take your receipt.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);
                                                String receipt =    "In time: "+inhourInput+" "+inminuteInput+
                                                                    "\nOut time: "+outhourInput+" "+inminuteInput+
                                                                    "\nDuration: "+hour+"hours and "+minute+"minutes."+
                                                                    "\nVehicle Type: "+typeVehicle+
                                                                    "\nParking fee: "+fee;
                                                JOptionPane.showMessageDialog(null,receipt,"Vehicle Parking System - Parking Receipt",JOptionPane.INFORMATION_MESSAGE);}
                                            break;
                            default     :   JOptionPane.showMessageDialog(null,"Unknown Error Occurred!","Vehicle Parking System",JOptionPane.ERROR_MESSAGE);
                                            break;}}


                    else
                        JOptionPane.showMessageDialog(null,"Process Canceled.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);}
            else
                JOptionPane.showMessageDialog(null,"Process Canceled.","Vehicle Parking System",JOptionPane.INFORMATION_MESSAGE);



   }
}

我已经在这里停留了半天,对于某些人来说可能还不够长。 但是我确实需要一些帮助。 谢谢。

在第一个示例中,看起来是引起问题的行是:

double outhourInput = Double.valueOf(outhour);

引用的异常跟踪指示超时时间为空/空。 因此,在转换之前,请检查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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM