0

これが私が得たエラーコードです:

Exception in thread "main" java.lang.StackOverflowError
    at JavaKeywords.<init>(JavaKeywords.java:5)
    at LAddClass.<init>(LAddClass.java:8)
    at LStore.<init>(LStore.java:9)
    at LAddClass.<init>(LAddClass.java:9)
    at LStore.<init>(LStore.java:9)

以下は、上記の 3 つのクラスです。プログラムのほぼ全体のコードを投稿して申し訳ありませんが、どこにエラーがあるのか​​ 本当にわかりません。エラー コードによってマークされた 3 行は、以下で強調表示されています。

これは、UML から Java へのコンバーターのプログラムです。ユーザーは、クラス名とクラス タイプ (public/private) を入力し、変数を仮想クラスに格納する必要があります。ユーザーの入力、String className、およびブール値の isPrivate を格納するクラス オブジェクトの ArrayList を作成しました。後で、ユーザーがテキストをコピーできるように、クラス名とタイプを GUI ウィンドウに出力する必要があります。

エラーは、LStore クラスのオブジェクトの arrayList である値 ( String className, String classMethod, boolean isPrivate)を格納できなかったことに関連していると思います。ArrayList<LStore>以前、配列リストに関連する Null Pointer Exception エラーが発生しました。コードとクラス名の一部を変更した後、この新しいstackOverFlowエラーが発生しました。

LAddClass class 後で使用するために文字列を使用checkName()および変換するためbolean isPrivate

public class LAddClass{
private String className;
private String methodName;
private boolean isPrivate;

JavaKeywords keyObject = new JavaKeywords(); 

LStore stObject = new LStore(className, methodName,isPrivate);//<<<<<<<<<<<<<<<<<<<<<<<<<<< related to the error

public String getPublic(){
    String s;
    if (stObject.getIsPrivate() == true) 
        s = " private";
    else 
        s = "public";
    return s;
}    
public void setPublic(){

}

public boolean checkName(String name){
    boolean check = true;
    for (int i=0; i<=stObject.getListSize(); i++){

        if (keyObject.containsKeyword(name) || name.equals(stObject.getClassName())){

            boolean o = false;
            check = o;
        }// end if
    }// end for
    return check;
}// end checkName

 }//end class

LStore class変数を格納するためのクラスですArrayList<LStore>

import java.util.*;

public class LStore {

    public static ArrayList<LStore> classes = new ArrayList<LStore>();
    public boolean isPrivate;
        public String className;
        public String methodName;
        LAddClass classObject = new LAddClass(); //<<<<<<<<<<<<<<<<<<<<<<<<<<< related to the error

        public LStore(String name, String method, boolean isP){
        this.className = name;
        this.isPrivate = isP;
        this.methodName = method;
        classes.add(this);
     }

     public String getClassName(){
        return className;
    }    

    public String getMethodName(){
        return methodName;
    }

    public boolean getIsPrivate(){
        return isPrivate;
    }


    public int getListSize(){
        return classes.size();
    }

    public String getJavaCode(){
        String javaCode = (classObject.getPublic() + " " + className +"{\n"+"\t"+methodName+"\t\n}"+"}");
    return javaCode;

    }
}

GuiAddClassここでは、ユーザーが新しいクラスを作成するための GUI クラスです。誤字脱字もあるかと思いますので参考までに。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GuiAddClass extends JFrame{
LAddClass classObject = new LAddClass();

private JRadioButton publicButton, privateButton;
private JLabel clazz;
private JTextField inputClassName;
private JLabel mothod;
private JTextField inputMethodName;
private JLabel note;
private JButton confirmButton;
private JButton cancelButton;

public GuiAddClass(){

    super("Create class");
    setLayout(new FlowLayout());

    publicButton = new JRadioButton("public", false);
    privateButton = new JRadioButton("private", true);
    clazz = new JLabel("Class Name: ");
    inputClassName = new JTextField("ExampleClass",10);
    mothod = new JLabel("Method Name*: ");
    inputMethodName = new JTextField("doSomething()",10);
    note = new JLabel("*All methods are public void in default. You may only create one method for a class.");
    confirmButton = new JButton("Confirm");
    cancelButton = new JButton("Cancel");

    add(publicButton);      
    add(privateButton);     
    add(clazz);     
    add(inputClassName);
    add(mothod);
    add(inputMethodName);
    add(note);
    add(confirmButton);
    add(cancelButton);

    ButtonGroup group = new ButtonGroup();
    group.add(publicButton);
    group.add(privateButton);

    Handler handler = new Handler();
    NewHandler newhandler = new NewHandler();
    confirmButton.addActionListener(handler);
    cancelButton.addActionListener(newhandler);

}// end constructor AddClass()

private class Handler implements ActionListener{

    public void actionPerformed(ActionEvent event){

        String cName = inputClassName.getText();
        String mName = inputMethodName.getText();
        boolean isP = true;

        if (classObject.checkName(cName) == false){

            JOptionPane.showMessageDialog(null, "Class name invalid. " +
                    "\nEntered name should not contain java keywords or equal to other existing names. " +
                    "\nPlease try again."); 

        } else if (classObject.checkName(cName) == true) {

            JOptionPane.showMessageDialog(null, "Class saved."); 
            cName = inputClassName.getText();
            mName = inputMethodName.getText();

            if (event.getSource() == publicButton) {
                isP = false;
            } else if (event.getSource() == privateButton) {
                isP = true;
            }
            new LStore(cName, mName, isP);
        }



    }// end actionPerformed()

}// end Handler class

private class NewHandler implements ActionListener{
    public void actionPerformed(ActionEvent event){
        setVisible(false);
    }
}

   }// end AddClass

JavaKeywords classクラス名が有効かどうかを確認する方法は? className が Java の予約済みキーワードと等しいかどうかをチェックするメソッドを持つクラス。このクラスは非常に頻繁にエラーとして検出されるように見えたため、エラーにも関連している可能性があります

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;

/**
 * JavaKeywords is a Utility class related to the reserved keywords
 *
 * @author MrLore from https://stackoverflow.com/questions/13979172/how-to-check-if-the-class-name-is-valid
 */
public class JavaKeywords 
{
    private static final HashSet<String> keywords = new HashSet(Arrays.asList(new String[]{
    //There are 50 keywords, and 3 literals; true, false and null.
    "abstract",     "assert",        "boolean",      "break",           "byte",
    "case",         "catch",         "char",         "class",           "const",
    "continue",     "default",       "do",           "double",          "else",
    "enum",         "extends",       "false",        "final",           "finally",
    "float",        "for",           "goto",         "if",              "implements",
    "import",       "instanceof",    "int",          "interface",       "long",
    "native",       "new",           "null",         "package",         "private",
    "protected",    "public",        "return",       "short",           "static",
    "strictfp",     "super",         "switch",       "synchronized",    "this",
    "throw",        "throws",        "transient",    "true",            "try",
    "void",         "volatile",      "while"    ,    "string",   "int"
}));

public static boolean isKeyword(String toCheck){ 
    return getKeywords().contains(toCheck);
}//End isKeyword()

public static String[] getAsArray(){
    return getKeywords().toArray(new String[getKeywords().size()]);
}//End getAsArray()

public static ArrayList<String> getAsArrayList(){
    return new ArrayList(getKeywords());
}//End getAsArrayList()

public static HashSet<String> getAsHashSet(){
    return getKeywords();
}//End getAsHashSet()

public static HashSet<String> getKeywords() {
    return keywords;
}//End getKeywords

public boolean containsKeyword(String toCheck){

    toCheck = toCheck.toLowerCase(); //<<<<<<<<<<<<<<<<<<<<<<< this line had been detected as error of null-pointer-exception
    for(String keyword : keywords){
        if(toCheck.equals(keyword) || toCheck.endsWith("." + keyword) ||
           toCheck.startsWith(keyword + ".") || toCheck.contains("." + keyword + ".")){

            return true;
        }//End if
    }//End for
    return false;
}//End containsKeyword()

}//End JavaKeywords

というわけでコードは以上です!! 私の他のクラスは、データの保存とは関係のない単なる GUI クラスなので、投稿すべきではないと思います。私の質問を読んでくれてありがとう。何か考えがあれば、助けてください:(

4

2 に答える 2

1

スタックトレースを読むことで問題を見つけることができます:

  • LJKeywords(by at LJKeywords.<init>(LJKeywords.java:10)メッセージ)のインスタンスを作成する際の問題。
  • これは、LAddClass ( (LAddClass.java:8)メッセージで)のインスタンスを作成するときに発生します。LAddClass.<init>
  • LStoreこれは、クラスのインスタンスを作成するときに発生します( at LStore.<init>(LStore.java:9)メッセージによる)。

次に、クラスのコンストラクターとフィールドを確認するLAddClassLStore、次のことがわかります。

public class LAddClass{
    LJKeywords keyObject = new LJKeywords();
    LStore stObject = new LStore(className, methodName,isPrivate);
    //...
}

public class LStore {
    LAddClass classObject = new LAddClass();
    //...
}

それで、これは何をしているのですか?LStoreオブジェクト参照を作成するとLAddClass、内部でオブジェクト参照が作成され、内部で新しいLStoreオブジェクト参照が作成され、内部でLAddClassオブジェクト参照が作成され、内部でオブジェクト参照が作成されます。ここでオブジェクトのインスタンス化ループ。

これを解決するにはどうすればよいですか?この無限ループを取り除いた後、クライアントクラスで分離して関連付けることLAddClassで andを作成できます。LStore例えば:

class Client {
    void foo() {
         LAddClass lAddClass = new LAddClass();
         LStore lStore = new LStore();
         lStore.setLAddClass(lAddClass);
         lAddClass.setLStore(lStore);
         //...
    }
}

また、クラスの名前をより意味のある名前に変更することをお勧めします。たとえば、 の代わりにLStoreを使用し、使用Storageの代わりに(またはより適した名前)をLAddClass使用します。UMLClass

于 2013-10-27T09:21:48.243 に答える
1

問題は、LStoreインスタンスを作成するLAddClassために - を作成し、LAddClassインスタンスを作成するためにインスタンスを作成することですLStore。つまり、1 つのコンストラクターが効果的に別のコンストラクターを呼び出しており、それが最初のコンストラクターを呼び出しているなどです。LJKeywordsクラスはここで厄介者だと思います。LJKeywords新しいLAddClassインスタンスが作成されたときにコンストラクターが呼び出されるだけで、たまたまそのストローでした。らくだの背中を折った。

LStore基本的に、 と の関係をどのように機能させたいかを考え出す必要がありますLAddClass。このように無条件にお互いを構築し続けることはできません。

また、これらすべてのクラス名からプレフィックスを削除することを強くお勧めします。L

于 2013-10-27T09:21:58.240 に答える