最后的 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 + "]");
}
}
}
我正在处理令牌迭代器(有效令牌,"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 + "]");
}
}
}