これが私が得たエラーコードです:
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 クラスなので、投稿すべきではないと思います。私の質問を読んでくれてありがとう。何か考えがあれば、助けてください:(