“线程中的异常”;“主要”;java.util.NoSuchElementException
我正在练习编写java代码,我试图解决这个问题,但我不知道如何解决它了。我会给你看我的代码 在我的Fortunecookie.java中:“线程中的异常”;“主要”;java.util.NoSuchElementException,java,Java,我正在练习编写java代码,我试图解决这个问题,但我不知道如何解决它了。我会给你看我的代码 在我的Fortunecookie.java中: public class FortuneCookie { private String subjectList; private String objectList; private String verbList; private int sWord; private int oWord; private i
public class FortuneCookie {
private String subjectList;
private String objectList;
private String verbList;
private int sWord;
private int oWord;
private int vWord;
private Random random = new Random() enter code here;
public FortuneCookie() {
subjectList = "I#You#He#She#It#They";
objectList = "me#you#him#her#it#";
verbList = "hate#love#deny#find#hear#forgive#hunt#win#teach";
}
public String getFortuneMsg() {
StringTokenizer subSt = new StringTokenizer(subjectList,"#");
StringTokenizer objSt = new StringTokenizer(objectList,"#");
StringTokenizer verbSt = new StringTokenizer(verbList,"#");
sWord = subSt.countTokens();
oWord = objSt.countTokens();
vWord = verbSt.countTokens();
int c1 = random.nextInt(sWord);
String line1 = " ";
String line2 = " ";
String line3 = " ";
while(subSt.hasMoreTokens()) {
line1 = subSt.nextToken("#");
for (int i=0;i<sWord;i++)
if (i == c1) {
break;
}
else{
line1 = subSt.nextToken("#");
}
}
int c2 = random.nextInt(oWord);
while(objSt.hasMoreTokens()) {
line2 = objSt.nextToken("#");
for (int i=0;i<sWord;i++)
if (i == c2) {
break;
}
else{
line2 = objSt.nextToken("#");
}
}
int c3 = random.nextInt(vWord);
while(verbSt.hasMoreTokens()) {
line3 = verbSt.nextToken("#");
for (int i=0;i<sWord;i++)
if (i == c3) {
break;
}
else{
line3 = verbSt.nextToken("#");
}
}
return line1+line2+line3;
}
public void setSubjectList(String aSubjectList) {
subjectList = aSubjectList;
}
public void setObjectList(String aObjectList) {
objectList = aObjectList;
}
public void setVerbList(String aVerbList) {
verbList = aVerbList;
}
public void print() {
StringTokenizer subSt = new StringTokenizer(subjectList,"#");
StringTokenizer objSt = new StringTokenizer(objectList,"#");
StringTokenizer verbSt = new StringTokenizer(verbList,"#");
sWord = subSt.countTokens();
oWord = objSt.countTokens();
vWord = verbSt.countTokens();
System.out.println("Subject List : "+subjectList);
System.out.println("Object List : "+objectList);
System.out.println("Verb List : "+verbList);
}
当我编译并运行它时:
//Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(Unknown Source)
at java.util.StringTokenizer.nextToken(Unknown Source)
at CS_111_Homework_2.FortuneCookie.getFortuneMsg(FortuneCookie.java:39)
at CS_111_Homework_2.FortuneCookieTest.main(FortuneCookieTest.java:6)
如何解决它?在代码的这一部分中,您可以调用
objSt.nextToken(“#”)两次,如果第一次调用得到最后一个元素,那么在第二次调用中,您将得到NoSuchElementException
,因为没有更多的元素可用
while (objSt.hasMoreTokens()) {
line2 = objSt.nextToken("#");
for (int i = 0; i < sWord; i++)
if (i == c2) {
break;
} else {
line2 = objSt.nextToken("#");
}
}
while(objSt.hasMoreTokens()){
第2行=objSt.nextToken(“#”);
for(int i=0;i
实际上,代码有几个问题,特别是这个方法getFortuneMsg()
:
您正在对所有循环使用swarm
,而应该对第一个循环使用swarm
,对第二个循环使用oWord
,对最后一个循环使用vWord
另外,您正在调用line1=subSt.nextToken(“#”)
在开始循环之前,您已经使用了一个令牌,这可能会产生NoTouchElementException
我建议将此更改为(int i=0;感谢您的所有答案。我现在可以解决。再次感谢。:)感谢您的所有答案。我现在可以解决它。再次感谢您。:)
while (objSt.hasMoreTokens()) {
line2 = objSt.nextToken("#");
for (int i = 0; i < sWord; i++)
if (i == c2) {
break;
} else {
line2 = objSt.nextToken("#");
}
}
public String getFortuneMsg() {
StringTokenizer[] tokenizers = {new StringTokenizer(subjectList, "#"), new StringTokenizer(objectList, "#"), new StringTokenizer(verbList, "#")};
StringBuilder sb = new StringBuilder();
for (StringTokenizer tokenizer : tokenizers) {
int rCount = random.nextInt(tokenizer.countTokens());
for (int i = 0; i < rCount; i++) {
tokenizer.nextToken();
}
sb.append(tokenizer.nextToken());
}
return sb.toString();
}