我是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));
}
}
}
答案 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
请注意以下建议: