2017-02-22 101 views
0

我正在练习编写Java代码,我试图解决这个问题,但我不知道如何解决它。我会告诉你我的代码。线程“主”异常java.util.NoSuchElementException

在我Fortunecookie.java是:

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); 
    } 

在我FortuneCookieTest.java是

public class FortuneCookieTest { 
    public static void main(String[] args) { 
     FortuneCookie ck = new FortuneCookie(); 
     System.out.println(ck.getFortuneMsg()); 
    } 
} 

当我编译并运行它:

//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) 

我怎样才能解决这个问题?

回答

0

在这部分代码中,您可以调用objSt.nextToken("#")两次,如果第一次调用获取最后一个元素,则在第二次调用时,您将获得NoSuchElementException,因为没有更多元素可用。

while (objSt.hasMoreTokens()) { 
    line2 = objSt.nextToken("#"); 
    for (int i = 0; i < sWord; i++) 
     if (i == c2) { 
      break; 
     } else { 
      line2 = objSt.nextToken("#"); 
     } 
} 

This is a different use case, but has the same problem

+0

谢谢你们的一切answer.I现在可以解决它。再次感谢你。 :) –

0

其实有与代码中的几个问题,特别是用这种方法getFortuneMsg()

  1. 您使用sWord所有的循环,而不是你应该使用sWord为先循环oWord第二个和vWord和最后一个。
  2. 另外您在启动循环之前调用line1 = subSt.nextToken("#");,以便您已经消耗了一个标记,这可能会产生NoSuchElementException我建议将此for (int i=0; i<sWord; i++)更改为此for (int i=0; i<sWord - 1; i++)以考虑消耗的标记。
  3. 而对于这个循环while(subSt.hasMoreTokens())如果不是所有的标记都被消耗掉了(这可能发生在c1 < sWord),它会重新开始。

注意:代码需要重构以防止重复并明智地使用循环。

编辑:我不明白到底是什么,你要实现的目标,但如果我是你,我想这个方法getFortuneMsg()改变这样的事情:

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(); 
} 
+0

谢谢你所有的答案。我现在可以解决它,再次感谢你。 :) –

相关问题