0

我是 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));
    }
}

}
4

2 回答 2

0

最好将输入作为<temp1> <unit1> <temp2> <unit2>. 这样,您将获得所需格式的所有参数。您现在可以解析args[0]args[2]用于 tempValues 和其他两个参数的单位。更好的是,只需将<temp1> <temp2>命令行参数作为您的命令行参数并确定它<temp1>在 degC 和<temp2>F 中。

于 2013-07-13T03:10:57.337 回答
0

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

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

那是因为你这样做

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

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

请对我的以下建议持开放态度:

  • 面向对象意味着您创建将承担责任的类
  • 你的温度类也以摄氏度和华氏度存储温度……这可能更容易,但仅存储开尔文意味着你在类中有一个强大的内在概念
  • 当有人要求 C 或 F 时,它从 K 计算
  • 之后,温度类的构造函数应该负责解析“0.0C”和“42.0F”
于 2013-07-13T03:15:35.383 回答