简体   繁体   English

从Jtextfield输入解析Double / Int

[英]Parsing Double/Int from Jtextfield Input

I'm new in Java and I'm now trying to create a program that receive value from user using JTextfield and use the value to perform some calculation. 我是Java的新手,我现在正尝试创建一个程序,该程序使用JTextfield从用户那里接收值并使用该值执行一些计算。 I've encountered a problem that the JTextfield will have NumberFormatException Error when I trying to compile it. 我在尝试编译JTextfield时遇到了一个问题,即JTextfield将出现NumberFormatException错误。 Here is my code: 这是我的代码:

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);

And here is what i get when i try to compile it: 这是我尝试编译时得到的结果:

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)

There're more at the bottom for display and arithmetic purpose. 底部还有更多显示和算术目的。 Also, I've tried to use the try and catch, but it doesn't solve my problem at all.(Even more error were shown up.) Here are my full program after using the try and catch to try to solve the Number Format Exception problem.(I know it's somehow too long for such simple arithmetic program. Sorry.) 另外,我尝试使用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);



   }
}

I've been stucked here for half a day, maybe not long enough for some people. 我已经在这里停留了半天,对于某些人来说可能还不够长。 But I really do need some help. 但是我确实需要一些帮助。 Thanks. 谢谢。

In the first example, it appears the line that is causing the problem is: 在第一个示例中,看起来是引起问题的行是:

double outhourInput = Double.valueOf(outhour);

The exception trace referenced indicates that outhour is empty/null. 引用的异常跟踪指示超时时间为空/空。 Therefore, prior to the conversion, check to see if outhour is empty (eg, outhour != null && ! outhour.trim().isEmpty() ). 因此,在转换之前,请检查outhour是否为空(例如, outhour != null && ! outhour.trim().isEmpty() )。

Having copied the code (from the 2nd example) into an IDE, it is quickly clear where the problem is. 将代码(从第二个示例中复制)到IDE中后,可以很清楚地知道问题出在哪里。 You do not have a problem with NumberFormatException per se . 本身 没有 NumberFormatException问题。 The problem, which is in multiple places, is a scope issue with the variables. 这个问题在很多地方都是变量的范围问题。

       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;
            }
        }

In all of your blocks, you must ensure that the defined variable is in scope in the catch blocks. 在所有块中,必须确保定义的变量在catch块的范围内。 However, I do not see the point of the if tests since they all set to the variable to 0.0 anyway. 但是,我看不到if测试的意义,因为无论如何它们都将变量设置为0.0。

Try an approach such as: 尝试以下方法:

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