0

好吧,伙计们,我正在尝试对 Java 有一个基本的了解,我想我会做一些比平常更复杂的事情。我在这个方法中首先尝试检查第一个字符是否可以是 int,如果是,我想看看这个数字在输入中的距离(所以如果用户输入 455+60,我'd 想要拔出 455 并停在 +)。

出于某种原因,如果输入是 500t,它会正常工作。但是如果索引在数字之后结束(比如输入只是 500),那就有问题了。我认为 for 循环出于某种原因继续运行。谁能告诉我我在哪里搞砸了?我添加了一个 if 语句以查看是否可以阻止它,但无济于事。

public void init(){
    int chars = 0;
    /*
     * Input fancy intro here.
     */
    clearArray();
    String uInput = getInput();
    rawInput=uInput.toCharArray();
    cleanArray(rawInput);
    try{Integer.parseInt(Character.toString(rawInput[0]));
    boolean isNum = true;
    for(int i=0;isNum==true;i++){
        if(i != rawInput.length){
        try{Integer.parseInt(Character.toString(rawInput[i]));}
        catch (NumberFormatException s){
            isNum = false;
            chars = i;
            System.out.println("The number has: "+chars+" characters.");
        }
        }
        }       
    }
    catch (NumberFormatException s){
        System.out.println("What is this madness?");

    }



}
4

3 回答 3

1

在这里,您避免要求rawInput[rawInput.length]

if(i != rawInput.length)

...但是您确实继续进行下一次迭代。

有什么理由你不能这样做:

for (int i = 0; i < rawInput.length && isNum; i++)

? 我还建议使用Character.isDigit或自定义检查,而不是将每个字符转换为字符串,然后对其进行解析并捕获异常。

请注意,这Character.isDigit将返回true您可能不想要的非 ASCII 数字。您很可能只想要一个简单的检查:

char c = rawInput[i];
if (c < '0' || c > '9') {
    isNum = false;
}

另请注意,正则表达式可能是一个更好的解决方案......

哦,如果你有一个空字符串,那现在会算作一个数字......

于 2013-01-18T16:05:00.870 回答
1

您可以通过在 for 循环中添加额外的检查来解决此问题,以查看您是否位于字符串的末尾。尝试:

for(int i=0;isNum==true && i<rawInput.length;i++){
于 2013-01-18T16:05:10.690 回答
0

你可以尝试这样的事情:

public int countDigits(String input) {
    int digitsCount = 0;

    for (int i = 0; i < input.length(); ++i) {
        if (Character.isDigit(input.charAt(i))) {
            ++digitsCount;
        } else {
            break;
        }
    }

    return digitsCount;
}
于 2013-01-18T16:11:36.423 回答