2012-03-11 10 views
1

私は自分のターミナルプロジェクトを持っていて、ターミナルの中に "create"とタイプすることができます。これは、私がプロンプトを作成してプログラムを作ることができます。今私の問題は、メインクラス(私は実行するコマンドを選択できる)に戻ることができないという事実です。私はSystem.exit(0)を使用しようと考えていました。しかし、わかりませんでしたが、それは単にプログラム全体を殺すだけです。誰かが私を助けることができるなら、私のファイルは以下の通りです。私は要求された場合、他のファイルを投稿することができます。メインクラスに戻る

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 { 
     while(_active) { 
      System.out.print(_username + "@" + _os + ":~/create$ "); 
      Scanner kbd = new Scanner(System.in); 
       String userLine = kbd.nextLine(); 

      if(java.util.regex.Pattern.matches(".*\\S\\s+\\S.*", userLine)) { 
        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 if(userLine.equalsIgnoreCase("exit")) { 
       System.exit(0); 
      } 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(); 
    } 
} 
+1

問題は、あなたが 'commandCreate' *コンストラクタ*の中で仕事をしていることです。この作業を行うことはできますが、一般的に受け入れられているオブジェクト指向プログラミングの構造は、まずメソッドを作成し、それから何かを行うことです。つまり、あなたのコードは 'commandCreate c = new commandCreate(); c.runCommand(); 'もしあなたがそれを持っていたら、あなたは外に出る準備ができたときにはいつでも 'runCommand'から'戻ることができます。 – Borealid

+0

これは私のプログラムにどのように実装されますか? –

+0

関連していませんが、クラス名を大文字にして名詞を使用してください。 'class CommandCreator'は混乱が少なく、メソッドに似ていません。 – jmort253

答えて

1

単純な答えは、commandCreateコンストラクタを返すか、例外を投げたり伝播したりすることです。実際には、ユーザーがEOFを入力した場合、これはすでに発生していると思います。

(あなたのコードには他にも多くの問題がありますが、あなた自身でそれを理解している方が良いでしょうが、 "commandCreate"や "CommandCreate"

0

ループが無限ループに詰まっていて、値_activeをfalseに設定していないという問題があるようです。かなり多くのことが出ないという問題を解決し

} else if(userLine.equalsIgnoreCase("exit")) { 
    _active = false; 
} else { 

} else if(userLine.equalsIgnoreCase("exit")) { 
    System.exit(0); 
} else { 

return;ステートメントも同様に機能します。私は、例外はこの特定のインスタンスでは過剰なことだと思う。サイドノート(とほとんどの人が指摘しているように見える何か)で

、私は、それ自身のメソッドでインスタンスのrun()をコードを配置して、あなたのmain方法で呼び出しnew commandCreate().run()を使用します。

関連する問題