尝试在Java中使用命令行参数时出错

时间:2013-07-13 02:55:01

标签: java eclipse command-line-arguments temperature

我是Java的新手,我仍然习惯于微小的差异,所以请原谅你可能觉得荒谬的任何错误。

我正在尝试编写一个存储温度的程序,可用于以摄氏度或华氏度调用该温度。我唯一的问题是命令行参数,在成功编译我的程序后,我输入以下内容:

java Driver 0.0C 32.0F

然后我明白了:

Exception in thread "main" java.lang.NumberFormatException: For input string:
"0.0C"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
    at java.lang.Float.parseFloat(Float.java:452)
    at Driver.main(Driver.java:47)

我的程序仍然没有完全打磨,所以我知道可以编写getter以提高效率,并且驱动程序甚至不会调用温度等级,但这不是我目前所关注的问题。我的驱动程序应该接受输入并从“C”或“F”字符确定该值是以摄氏度还是华氏度为单位。然后它解析字符串并截断C或F,并将字符串中包含的值存储为浮点数。我正在使用Eclipse,程序是面向对象的,这是我的代码:

public class Temperature {

    private float temperature;
    private char scale;

    // default constructor
    Temperature()   {
        this.temperature = 0;
        this.scale = 'C';
    }

    Temperature(float temperatureIn)    {
        this.temperature = temperatureIn;
        this.scale = 'C';
    }

    Temperature(char scaleIn)   {
        this.temperature = 0;
        this.scale = scaleIn;
    }

    Temperature(float temperatureIn, char scaleIn)  {
        this.temperature = temperatureIn;
        this.scale = scaleIn;
    }

    float degreesC(float degreesF)  {
        float degreesC = (5 * (degreesF - 32)) / 9;
        return degreesC;
    }

    float degreesF(float degreesC)  {
        float degreesF = (9*(degreesC / 5)) + 32;
        return degreesF;
    }

    void setTemperature(float temperatureIn)    {
        temperature = temperatureIn;
    }

    void setScale(char scaleIn) {
        scale = scaleIn;
    }

    void setBothValues(float temperatureIn, char scaleIn)   {
        temperature = temperatureIn;
        scale = scaleIn;
    }

    int compareTemps(Temperature temp1, Temperature temp2)  {

        // both values will be compared in Farenheit
        Temperature temp1temp = temp1;
        if (temp1temp.scale == 'C') {
            temp1temp.temperature = degreesF(temp1temp.temperature);
            temp1temp.scale = 'F';
        }

        Temperature temp2temp = temp2;
        if (temp2temp.scale == 'C') {
            temp2temp.temperature = degreesF(temp2temp.temperature);
            temp2temp.scale = 'F';
        }

        if (temp1temp.temperature == temp2temp.temperature) {
            return 0;
        }

        if (temp1temp.temperature > temp2temp.temperature)
            return 1;

        if (temp1temp.temperature < temp2temp.temperature)
            return -1;

        return 0;
    }
} 

主驱动程序:

public class Driver {

public static void main(String[] args) {

    // ints to hold the temperature values
    float temp1Value = 0;
    float temp2Value = 0;

    // strings to hold the scale types
    char temp1Scale = 'C';
    char temp2Scale = 'C';

    // declare objects of type temperature
    Temperature firstTemp = null;
    Temperature secondTemp = null;


    // copy scale values of temperatures
    int scaleIndex = 0;
    int scaleIndex2 = 0;
    if (args.length > 0)    {
        if (args[0].indexOf('C') != -1)
        {
            scaleIndex = args[0].indexOf('C');
            temp1Scale = args[0].charAt(scaleIndex);
        }
        else if (args[0].indexOf('F') != -1)
        {
            scaleIndex = args[0].indexOf('F');
            temp1Scale = args[0].charAt(scaleIndex);
        }

        if (args[1].indexOf('C') != -1)
        {
            scaleIndex = args[1].indexOf('C');
            temp2Scale = args[1].charAt(scaleIndex2);
        }
        else if (args[1].indexOf('F') != -1)
        {
            scaleIndex = args[1].indexOf('F');
            temp2Scale = args[1].charAt(scaleIndex2);
        }
    }

    // parse the values to exclude scales and copy to strings holding temperature values
    if (args.length > 0)    {
        temp1Value = Float.parseFloat(args[0].substring(0, scaleIndex));
        temp2Value = Float.parseFloat(args[1].substring(0, scaleIndex2));
    }
}

}

2 个答案:

答案 0 :(得分:0)

最好将输入视为<temp1> <unit1> <temp2> <unit2>。这样您就可以获得所需的所有参数。您现在可以为args[0]args[2]解析tempValues,并为单位解析另外两个参数。更好的是,只需将<temp1> <temp2>作为命令行参数,并确定<temp1>处于degC且<temp2>位于F中。

答案 1 :(得分:0)

您获得的异常是因为您将“0.0C”传递给浮动解析器:

tempValue = Float.parseFloat(args[1].substring(0, scaleIndex));

这是你做的事情

scaleIndex = args[1].indexOf('F');

有效地覆盖scaleIndex而不是设置scaleIndex2

请注意以下建议:

  • 面向对象意味着您创建将承担责任的类
  • 你的温度等级以摄氏度和华氏温度存储温度......这可能更容易,但仅存储例如凯尔温斯意味着你在课堂内有一个强大的内在概念
  • 当有人要求C或F从K
  • 计算时
  • 之后,Temperature类的构造函数应负责解析'0.0C'和'42 .0F'