在java中创建mad-lib游戏并接收NoSuchElementException方法

时间:2015-05-22 23:27:11

标签: java

我正在尝试创建一个收集.txt文件并播放游戏的java程序,然后将其全部打印到一个新文件中(由用户命名)。我已经达到了选择所有单词的程度,但之后我收到了NoSuchElementException消息。我有一个非常基本的java知识,绝对不知道如何继续。有人有建议吗?

import java.io.*;
import java.util.*;

public class MadLibs {
public static void main(String[] args) throws FileNotFoundException {
  Scanner console = new Scanner(System.in);

  intro();

  //in order to create the output file first prompts user to decide 
  //whether they want to create a mad-lib, view their mad-lib or quit
  //if 'c' is selected then while loop is exited
  String action = "c";
  String fileName = "fileName";
  while (action.equals("c")) {
     System.out.print("(C)reate mad-lib, (V)iew mad-lib, (Q)uit? ");
     action = console.nextLine();
     action = action.toLowerCase();
     File file = new File(fileName);
     System.out.print("Input file name: ");
     while (!file.exists()) {
        fileName = console.nextLine();
        file = new File(fileName);
        if (!file.exists()) {
           System.out.print("File not found. Try again: ");
        }
     }


     //asks for a file to read from for the mad-lib game
     //and creates file (named by user) to input the information
     System.out.print("Output file name: ");
     String outputName = console.nextLine();
     System.out.println();
     File outputFile = new File(outputName);
     PrintStream output = new PrintStream(outputFile);

     Scanner tokens = new Scanner(file);
     while (tokens.hasNext()) {
        String token = tokens.next();

        //calls the returned placeHolder
        String placeHolder = placeHolder(console, tokens, token);
        String newWord = madLib(console, token, placeHolder);


        //copies each token and pastes into new output file


     }
  }

  while (action.equals("v")) {       
     System.out.print("Input file name: ");
     fileName = console.nextLine();
     File outputFile = new File(fileName);
     if (!outputFile.exists()) { 
        System.out.print("File not found. Try again: ");
        fileName = console.nextLine();
     } else {
        PrintStream output = new PrintStream(outputFile);
        output = System.out;
     }
  }

  while (action.equals("q")) {
  } 

}

public static String madLib(Scanner console, String token, String        
placeHolder) throws FileNotFoundException{
  String word = placeHolder.replace("<", "").replace(">", ": ").replace("-",  
" ");
  String startsWith = String.valueOf(word.charAt(0));
  if (startsWith.equalsIgnoreCase("a") || startsWith.equalsIgnoreCase("e") 
 || 
      startsWith.equalsIgnoreCase("i") || startsWith.equalsIgnoreCase("o") 
 ||
      startsWith.equalsIgnoreCase("u")) {
     String article = "an ";
     System.out.print("Please type " + article + word);
     String newWord = console.next();
     return newWord;
  } else {
     String article = "a ";
     System.out.print("Please type " + article + word);
     String newWord = console.next();
     return newWord;
  }
}

public static String placeHolder(Scanner console, Scanner tokens, String  
 token) throws FileNotFoundException {
   while(!(token.startsWith("<") && token.endsWith(">"))) { 
      //not a placeholder! 
      //continue reading file
      token = tokens.next();
   }
   //outside of this while loop = found a placeholder!!
   String placeHolder = token;
   //returns placeholder to main 
   return placeHolder;
}



//method prints out the introduction to the game
public static void intro() {  
   System.out.println("Welcome to the game of Mad Libs");
   System.out.println("I will ask you to provide various words");
   System.out.println("and phrases to fill in a story.");
   System.out.println("The result will be written to an output file.");
   System.out.println();
 }
}

我目前正在使用名为simple.txt的文件,文本为:

I wannabe a <job> when I grow up.
Just like my dad.
Life is <adjective> like that!

这是完整的错误消息:

Exception in thread "main" java.util.NoSuchElementException
        at java.util.Scanner.throwFor(Scanner.java:862)
        at java.util.Scanner.next(Scanner.java:1371)
        at MadLibs.placeHolder(MadLibs.java:96)
        at MadLibs.main(MadLibs.java:46)

1 个答案:

答案 0 :(得分:1)

我运行了您的代码并获得了NoSuchElementException而不是NoSuchFileException。要绕过此异常,您需要在方法placeHolder中检查是否还有其他令牌。否则,在输入每个占位符后,您仍会搜索下一个占位符令牌,尽管没有next()

将您的代码更改为:

while(tokens.hasNext() && !(token.startsWith("<") && token.endsWith(">"))) { 
     //not a placeholder! 
     //continue reading file
     System.out.println(token);
     token = tokens.next();
}