我有一个将字符串转换为MeterNumber的方法。代码如下。
public static MeterNumber fromString(String number) {
MeterNumber mn = new MeterNumber(false);
int i = 0, // position in number
n = 0, // number of digits
len = number.length();
boolean valid = true;
while (valid && i < len) {
char c = number.charAt(i);
i = i + 1;
if (n < 9 && Character.isDigit(c)) {
mn.digits[n] = c - '0';
n = n + 1;
} else if (Character.isWhitespace(c)) {
// skip spaces
} else {
valid = false;
}
}
int cs = mn.checksum();
if (valid && i == len && n == 9 &&
cs / 10 == mn.digits[7] && cs % 10 == mn.digits[8]) {
return mn;
} else {
return null;
}
}
假设读取这样的输入:
531 481 889 O 788.5
652 364 795 P 2442.7
如果我只提供:
,它会正常工作531 481 889
652 364 795
但是,如果我的输入采用以下格式,则返回null:
531 481 889 O 788.5
652 364 795 P 2442.7
你能帮我看看问题吗?为什么字符末尾的Char和double会干扰?
这是调用该方法的代码。
private MeterNumber meterNumber;
public static Meter load(Scanner sc) {
MeterNumber meterNumber = MeterNumber.fromString(sc.nextLine());
int n = 1;
sc.nextLine();
Tariff[] tariffs = new Tariff[n];
for (int i = 0; i < n; i++) {
String kind = sc.next();
sc.nextLine();
if (kind.equals("P")) {
tariffs[i] = PeakTariff.PEAK_TARIFF;
} else if (kind.equals("O")) {
tariffs[i] = OffPeakTariff.OFF_PEAK_TARIFF;
}
}
return new Meter(meterNumber, tariffs);
}
public MeterNumber getMeterNumber() {
return meterNumber;
}
}
这是从我的main方法调用的代码:
Scanner sc2 = new Scanner(new java.io.File("Readings.txt"));
Meter meter = Meter.load(sc2);
System.out.println(meter.getMeterNumber());
提前致谢。
答案 0 :(得分:0)
它返回null,因为你说它无效。
while (valid && i < len) {
char c = number.charAt(i);
i = i + 1;
if (n < 9 && Character.isDigit(c)) {
mn.digits[n] = c - '0';
n = n + 1;
} else if (Character.isWhitespace(c)) {
// skip spaces
} else { //this else is the problem
valid = false;
}
}
如果它既不是空白也不是数字,你告诉它将valid
设置为false。由于O和P不是数字或空格,因此将有效设置为false。
if (valid && i == len && n == 9 &&
cs / 10 == mn.digits[7] && cs % 10 == mn.digits[8]) {
return mn;
} else {
return null;
}
if语句检查的第一件事是它是否有效。因为它不是,它返回null。