目前我在Java中有一个Atoi函数,它在传递字符串输入时返回一个int值。初始返回值设置为0.但是,如果输入字符串中传递了无效字符或所有字符,并且传递的实际字符串只是“0”,则返回的值将为0。如何在这两种情况下使用返回值?或者这没关系,我应该把它交给客户处理吗?
答案 0 :(得分:6)
在这种情况下,你几乎肯定不应该使用返回值 - 你应该使用例外。
在那时,我不确定你为什么要首先编写自己的方法 - 而是使用Integer.parseInt
。
如果您需要能够在没有异常的情况下传达无效输入的概念,您可能会编写一个返回Integer
而不是int
的方法,并返回如果输入无效,则为null
,否则为Integer
引用。
(我还要指出,Java倾向于支持有意义的名称,而不是atoi
等有些任意的字母集合。)
答案 1 :(得分:2)
这个确切的函数已由Integer.parseInt()系列方法处理。注意他们处理格式错误的输入的方式:他们抛出异常。
您应该认真考虑使用这些方法而不是您自己的方法。
答案 2 :(得分:1)
如果你的函数返回float或double,你可以返回NaN,但事实并非如此。
请勿在返回值中对此信息进行编码。如果遇到无效的输入字符串,则抛出异常。
答案 3 :(得分:0)
如果必须使用零来表示无效结果,并且无法使用上述所有情况,请添加另一个返回布尔值的方法,例如checkAtoI
解析的输入是否正确。在这种情况下,您可以检查零,然后调用checkAtoI
方法以了解它是否是有效的零输入,或者输入无效的输入零,0,返回整数。这个实现也很简单:
boolean check(String s) {
return s.equals("0");
}
答案 4 :(得分:0)
注意:抛出异常比返回null要慢。
我建议如果解析失败则返回null。但是,在整个应用程序的上下文中必须考虑这个解决方案
答案 5 :(得分:0)
如果你只想要字符串的整数前缀,我可能会使用正则表达式来获取数字
[0-9] *
然后调用Integer.parseInt
就像那样,
Pattern p = Pattern.compile("\s*([0-9]*)");
Match m = p.matcher(input);
if (m.matches())
return Integer.parseInt(m.group(1));
else
return 0;
答案 6 :(得分:0)
其中一个选项是抛出客户端需要处理的异常,然后采取适当的行动,这样做就是将错误处理委托给客户端,以便作为API实现者,您不必担心这是否客户端的情况是错误,异常或正常。他们将决定并处理异常(抑制噪音,提醒客户,要求客户重新输入等)。
如果在解析字符串时出现任何错误,则另一个选择是返回-1,在这种情况下,客户端也将决定下一步该做什么。
虽然抛出异常的优点是你可以随时传递有关异常消息中错误的详细信息,如果传递-1则不可能。
private static int getDecValue(char hex) {
int dec = 0;
switch (hex) {
case '0':
dec = 0;
break;
case '1':
dec = 1;
break;
case '2':
dec = 2;
break;
case '3':
dec = 3;
break;
case '4':
dec = 4;
break;
case '5':
dec = 5;
break;
case '6':
dec = 6;
break;
case '7':
dec = 7;
break;
case '8':
dec = 8;
break;
case '9':
dec = 9;
break;
default:
// do nothing
}
return dec;
}
public static int atoi(String ascii) throws Exception {
int integer = 0;
for (int index = 0; index < ascii.length(); index++) {
if (ascii.charAt(index) >= '0' && ascii.charAt(index) <= '9') {
integer = (integer * 10) + getDecValue(ascii.charAt(index));
} else {
throw new Exception("Is not an Integer : " + ascii.charAt(index));
}
}
return integer;
}