Почему я получаю это исключение? - PullRequest
0 голосов
/ 10 марта 2012

Я запускаю свою программу и пытаюсь запустить меню «Справка» из программы, которая запускается из этой программы (если это имеет смысл!).Но я получаю исключение NoSuchElement, которое даже не вызывается в моем try {} catch() ни в одной из программ!Что я делаюЗапускаю программу.Введите «create» для запуска класса commandCreate.Затем я набираю «Справка», чтобы запустить меню справки.Но я получаю исключение NoSuchElement.Если кто-нибудь сможет мне помочь с этим, две мои программы ниже.Спасибо.

main.java

// main.java
import java.io.*;

public class Main extends API {
      boolean _active = true;
     String _username = System.getProperty("user.name").toLowerCase();
     String _os = System.getProperty("os.name").trim().toLowerCase();

    public Main() {
         try {
            while(_active) {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                print(_username + "@" + _os + ":~$ ");
                String command = br.readLine();
                    if(command.equalsIgnoreCase("create")) {
                        new commandCreate();
                    /*} else if(command.equals("compile")) {
                        new commandCompile();*/
                    } else if(command.equalsIgnoreCase("help")) {
                        println("Commands");
                        println(" create              - Creates .java files, does not compile.");
                        //println(" compile             - Creates .java files, compiles on creation.");
                        println(" exit                - Exits program");
                        println(" help                - Shows help documentation.");
                    } else if(command.equalsIgnoreCase("exit")) {
                        print("Are you sure you want to exit? (Y/N) ");
                        String exit = br.readLine();
                        if(exit.equalsIgnoreCase("y")) {
                        exit();
                        } else {
                        println("Cancelled!");
                        }
                    } else if(command.isEmpty()) {

                    } else {
                        println("\"" + command + "\" does not exist. Please review the \"help\" menu");
                    }
            }
        } catch(Exception ex) {
            println("There was a problem: " + ex);
            }
   }

    public static void main(String[] args) {
     new Main();
    }
}

commandCreate.java

// commandCreate.java
import java.util.*;
import java.io.*;

public class commandCreate {
    boolean _active = true;
   String _username = System.getProperty("user.name").toLowerCase();
   String _os = System.getProperty("os.name").trim().toLowerCase();
   String fileName, create, option;

    public commandCreate() {
        try {
            System.out.print(_username + "@" + _os + ":~/create$ ");
            Scanner kbd = new Scanner(System.in);
                String userLine = kbd.nextLine();

            Scanner read = new Scanner(userLine);
                option = read.next();
                fileName = read.next();

            FileWriter create = new FileWriter(new File("Created Files/" + fileName + ".java"));

            if(userLine.equals(option + " " + fileName)) {
                if(option.equals("-a")) {
                    // Option = -a, creates standard file with main class.
                    create.write("public class " + fileName + " {\n");
                    create.write("  public static void main(String[] args) {\n");
                    create.write("      System.out.println(\"Welcome to your new program!\");\n");
                    create.write("  }\n");
                    create.write("}");
                } else if(option.equals("-c")) {
                    // Option = -c , creates standard file with overloaded constructor & main class.
                    create.write("public class " + fileName + " {\n");
                    create.write("  public " + fileName + "() {\n");
                    create.write("      System.out.println(\"Welcome to your new program!\");\n");
                    create.write("  }\n");
                    create.write("\n");
                    create.write("  public static void main(String[] args) {\n");
                    create.write("      new " + fileName + "();\n");
                    create.write("  }\n");
                    create.write("}");
                } else if(option.equals("-j")) {
                    // Option = -j, creates GUI within constructor w/ single JLabel.
                    create.write("import javax.swing.*;\n");
                    create.write("import java.awt.*;\n");
                    create.write("import java.awt.event.*;\n");
                    create.write("\n");
                    create.write("public class " + fileName + " extends JFrame {\n");
                    create.write("  private static final int HEIGHT = 50;\n");
                    create.write("  private static final int WIDTH = 400;\n");
                    create.write("\n");
                    create.write("  private JLabel welcomeJ;\n");
                    create.write("\n");
                    create.write("  public " + fileName + "() {\n");
                    create.write("    super(\"Welcome to your program - " + fileName + "\");\n");
                    create.write("      Container pane = getContentPane();\n");
                    create.write("    setLayout(new FlowLayout());\n");
                    create.write("\n");
                    create.write("      welcomeJ = new JLabel(\"Welcome To Your Program!\", SwingConstants.CENTER);\n");
                    create.write("\n");
                    create.write("      pane.add(welcomeJ);\n");
                    create.write("\n");
                    create.write("     setSize(WIDTH, HEIGHT);\n");
                    create.write("     setVisible(true);\n");
                    create.write("     setResizable(false);\n");
                    create.write("     setDefaultCloseOperation(EXIT_ON_CLOSE);\n");
                    create.write("  }\n");
                    create.write("\n");
                    create.write("  public static void main(String[] args) {\n");
                    create.write("      new " + fileName + "();\n");
                    create.write("  }\n");
                    create.write("}");
                }
            } else if(userLine.equalsIgnoreCase("help")) {
                System.out.println("Commands");
                System.out.println("  Syntax: [-option] [filename]");
                System.out.println("      -a [filename]      [Program: main class]");
                System.out.println("      -c [filename]      [Program: overloaded constructor, main class]");
                System.out.println("      -j [filename]      [Program: GUI: overloaded constructor, main class]");
            } else {
                System.out.println("Error in syntax. Please review the \"help\" menu");
            }
            create.close();
        } catch(IOException e) {
            System.out.println("There was an error: " + e);
        } catch(InputMismatchException ex) {
            System.out.println("There was an error: " + ex);
        }
    }

    public static void main(String[] args) {
        new commandCreate();
    }
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Согласно вашей трассировке стека, проблема здесь:

            Scanner kbd = new Scanner(System.in);
                String userLine = kbd.nextLine();

            Scanner read = new Scanner(userLine);
                option = read.next();
                fileName = read.next();             // <--- exception here

Что делает этот бит кода:

  • читает строку из стандартного ввода и сохраняет ее в userLine.
  • считывает два разделенных пробелами токена из userLine и сохраняет их как option и filename.

Итак, проблема в том, что строка из стандартного ввода на самом деле не имеет двух пробелов, разделенных пробелами. Он должен выглядеть примерно как -j file.txt, но вместо этого, может быть, он просто выглядит как -j или как file.txt.

1 голос
/ 10 марта 2012

У вас может быть проблема в суперклассе с именем API.Посмотри туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...