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)

私のプログラムはまだ完全に洗練されていないので、ゲッターを効率的に書くことができ、ドライバープログラムは温度クラスを呼び出さないことも知っていますが、現時点ではこれは私の関心事ではありません. My Driver は、入力を受け取り、'C' または 'F' の文字から、値が摂氏か華氏かを判断することになっています。次に、文字列を解析して C または F を切り捨て、文字列に含まれる値を float として格納します。私は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>。このようにして、必要なすべてのパラメーターを目的の形式で取得できます。これで、tempValues と単位の他の 2 つのパラメーターをargs[0]解析できるようになりました。args[2]さらに良いことに、<temp1> <temp2>コマンドライン引数をそのまま取り、それ<temp1>が degC で<temp2>あり、Fであると判断します。

于 2013-07-13T03:10:57.337 に答える