最后的 return 语句,忽略

Final return statement, ignore

我正在处理令牌迭代器(有效令牌,"true, false, "true"、"&"、"!"、"("、"false"、"^"、"true" , ")".

代码有效,我的问题是关于 return 值。我经常 运行 遇到这个问题,我有 return 语句,但是最后的 return 语句通过复制最后一个 return 语句来抛出我的结果。

我想我确定错误出在我放置 { 和 } 的位置,虽然我知道它们不是必需的,因为有太多嵌套的 if,我觉得它们是必要的。

这对我和我共事过的其他人来说似乎是一个常见问题,有没有人知道如何防止这个问题发生?谢谢!

我的代码输出:

行:[ ! BAD (true ^ false) % truelybad] 下一个标记:[!]

下一个标记:[(]

下一个标记:[true]

下一个标记:[^]

下一个标记:[false]

下一个标记:[)]

下一个标记:[)]

应该输出

下一个标记:[!]

下一个标记:[(]

下一个标记:[true]

下一个标记:[^]

下一个标记:[false]

下一个标记:[)]

public class TokenIter implements Iterator<String> {
ArrayList<String> token = new ArrayList<String>();
static int count = 0;
// input line to be tokenized
private String line;

// the next Token, null if no next Token
private String nextToken;

// implement
public TokenIter(String line) {
    this.line = line;

}

@Override
// implement
public boolean hasNext() {
    // System.out.println(count);
    return count < line.length();
}

@Override
// implement
public String next() {
    while (hasNext()) {

        char c = line.charAt(count);
        if (c == '!' || c == '!' || c == '^' || c == '(' || c == ')') {
            token.add(Character.toString(c));
            count++;
            nextToken = Character.toString(c);
            return nextToken;
                } else if (c == 't' || c == 'T') {
                    count++;
                    c = line.charAt(count);
                        if (c == 'r') {
                            count++;
                            c = line.charAt(count);
                            }
                                if (c == 'u') {
                                    count++;
                                    c = line.charAt(count);
                                }
                                    if (c == 'e') {
                                        count++;
                                        c = line.charAt(count);

                                    }if (c == ' ' || c == '!' || c == '!' || c == '^' || c == '(' || c == ')'){
                                        token.add("true");

                                        nextToken = "true";
                 //count++;
                                        return nextToken;
                                    }

        } else if (c == 'f' || c == 'F') {
            count++;
            c = line.charAt(count);
            if (c == 'a') {
                count++;
                c = line.charAt(count);
            }
            if (c == 'l') {
                count++;
                c = line.charAt(count);
            }
            if (c == 's') {
                count++;
                c = line.charAt(count);
            }
            if (c == 'e') {
                count++;
                c = line.charAt(count);

            }
            if (c == ' ' || c == '!' || c == '!' || c == '^' || c == '(' || c == ')'){
                token.add("false");

                nextToken = "false";
                // count++;
                return nextToken;
            }

        } else if (c == ' ') {
            count++;
        } else {
            count++;
        }

    }


    return nextToken;
}

@Override
// provided, do not change
public void remove() {
    // TODO Auto-generated method stub
    throw new UnsupportedOperationException();
}

// provided
public static void main(String[] args) {
    String line;
    // you can play with other inputs on the command line
    if (args.length > 0)
        line = args[0];
    // or do the standard test
    else
        line = " ! BAD (true ^ false) % truelybad";
    System.out.println("line: [" + line + "]");
    TokenIter tokIt = new TokenIter(line);
    while (tokIt.hasNext())
        System.out.println("next token: [" + tokIt.next() + "]");
}

}

这里的根本问题是您的 hasNext() 方法 return 如果字符串中有另一个标记则不是,而是如果它还没有完成对字符串的解析。

如果你输入字符串 " ! ! true lotsofcrap ",那么调用 next() 会发生 return "!",然后 "!",然后 "true",然后在 returned 之后,字符串中不再有标记,但 hasNext() 仍然 return 为真。

您可能考虑做的是让 hasNext() 解析字符串,而不是 return 下一个字符串,return 只有当它在字符串之前找到另一个标记时才为真当前位置。请记住,在 hasNext() 中,您不想直接递增 count。相反,在 hasNext() 的开头创建一个局部变量 int something = count; 并使用它。如果你解决了这个问题,那么你的代码的其余部分 应该 可以正常工作。

只有当最后一位数字不是标记时,您的代码才会出现问题。 原因 - 你正在检查 hasNext() 这是真的它进入你的 code.You 没有为这种情况设置 nextToken 所以它使用你的 lask 令牌并显示它。 我将您的代码更新为始终 return 一个值并检查值 return 是否来自令牌列表然后显示否则忽略它。

   public class test implements Iterator<String> {
            static List<String> tokenList = Arrays.asList( "true", "&", "!", "(", "false", "^", "true", ")");
            ArrayList<String> token = new ArrayList<String>();
            static int count = 0;
            // input line to be tokenized
            private String line;

            // the next Token, null if no next Token
            private String nextToken;

            // implement
            public test(String line) {
                this.line = line;

            }

            @Override
            // implement
            public boolean hasNext() {
                // System.out.println(count);
                return count < line.length();
            }

            @Override
            // implement
            public String next() {
                while (hasNext()) {

                    char c = line.charAt(count);
                    if (c == '!' || c == '!' || c == '^' || c == '(' || c == ')') {
                        token.add(Character.toString(c));
                        count++;
                        nextToken = Character.toString(c);
                        return nextToken;
                    } else if (c == 't' || c == 'T') {
                        count++;
                        c = line.charAt(count);
                        if (c == 'r') {
                            count++;
                            c = line.charAt(count);
                        }
                        if (c == 'u') {
                            count++;
                            c = line.charAt(count);
                        }
                        if (c == 'e') {
                            count++;
                            c = line.charAt(count);

                        }if (c == ' ' || c == '!' || c == '!' || c == '^' || c == '(' || c == ')'){
                            token.add("true");

                            nextToken = "true";
                            //count++;
                            return nextToken;
                        }

                    } else if (c == 'f' || c == 'F') {
                        count++;
                        c = line.charAt(count);
                        if (c == 'a') {
                            count++;
                            c = line.charAt(count);
                        }
                        if (c == 'l') {
                            count++;
                            c = line.charAt(count);
                        }
                        if (c == 's') {
                            count++;
                            c = line.charAt(count);
                        }
                        if (c == 'e') {
                            count++;
                            c = line.charAt(count);

                        }
                        if (c == ' ' || c == '!' || c == '!' || c == '^' || c == '(' || c == ')'){
                            token.add("false");

                            nextToken = "false";
                            // count++;
                            return nextToken;
                        }

                    } else if (c == ' ') {
                        count++;
                        nextToken = null;
                    } else {
                        count++;
                        nextToken = null;
                    }

                }


                return nextToken;
            }

            @Override
            // provided, do not change
            public void remove() {
                // TODO Auto-generated method stub
                throw new UnsupportedOperationException();
            }

            // provided
            public static void main(String[] args) {
                String line;
                // you can play with other inputs on the command line
                if (args.length > 0)
                    line = args[0];
                // or do the standard test
                else
                    line = " ! BAD (true ^ false) % truelybad ";
                System.out.println("line: [" + line + "]");
                test tokIt = new test(line);
                while (tokIt.hasNext()) {
                    String s = tokIt.next();
                    if (s != null && tokenList.contains(s))
                    System.out.println("next token: [" + s + "]");
                }
            }

}