无法在类对象的ArrayList中存储值。 (编辑编辑)

这基本上是一个Java代码转换器。 它涉及一个GUI让用户输入类的类型,名称和方法。 为了存储这些值,我创建了一个带有ArrayList classes来存储变量boolean isPrivateString classNameString methodName 。 但是,我发现没有任何内容存储在ArrayList …请帮我看看是什么问题

下面是VirtualClass

 import java.util.*; public class VirtualClass { private static ArrayList classes = new ArrayList(); private boolean isPrivate; private String className; private String methodName; public void setVirtualClass(String name, String method, boolean isP){ this.className = name; this.isPrivate = isP; this.methodName = method; } public void createClass(String name, String method, boolean isP){ this.className = name; this.isPrivate = isP; this.methodName = method; classes.add(this); } 

作为参考,这里是GUI的一些相关代码,用户可以创建类

 public class GuiAddClass extends JFrame{ private VirtualClass stObject; ... 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."); // this message pane has popped up cName = inputClassName.getText(); mName = inputMethodName.getText(); if (event.getSource() == publicButton) { isP = false; } else if (event.getSource() == privateButton) { isP = true; } stObject = new VirtualClass(); stObject.createClass(cName, mName, isP); } }// end actionPerformed() }// end Handler class 

这里有一些来自另一个类的方法来显示最终的javaCode

 public String getClassName(){ String cName = "classname"; String c = "c"; for (int i=0; i<classes.size(); i++){ c = classes.get(i).className; } cName = c; return cName; } public String getMethodName(){ String mName = "methodname"; String m = "m"; for (int i=0; i<classes.size(); i++){ m = classes.get(i).methodName; } mName = m; return mName; } public boolean getIsPrivate(){ boolean isP = false; for (int i=0; i<classes.size(); i++){ isP = classes.get(i).isPrivate; } return isP; } 

这是生成Java代码的方法

  public String getJavaCode(){ String javaCode = (classObject.getPublic() + " class " + stObject.getClassName() + stObject.getListSize() + "{\n"+"\t"+"public void "+stObject.getMethodName()+"{\n"+"\t}"+"\n}"); return javaCode; 

在我的程序中显示的是这样的,其中c应该是类名,m应该是方法名, 0 = classes.size()

 public class c0{ public void m{ } } 

有人能帮我解决问题吗? 我只是不知道,我收到的答案似乎不起作用。 请帮忙!

根据您发布的信息,您似乎很奇怪您将VirtualClass stObject启动到actionPerformed方法。 这意味着每次重新创建对象时。

例如,使您的VirtualClass stObject成为全局的 ,例如:

 private VirtualClass stObject; ... stObject = new VirtualClass(); private class Handler implements ActionListener{ public void actionPerformed(ActionEvent event){ ... stObject.createClass(cName, mName, isP); 

你的代码有几个问题。 但主要是,你的创造逻辑没有多大意义。 您不应使用实例的方法将实例添加到Static集合中。 我的建议是使用静态工厂方法来做到这一点。 取而代之的是:

 public class VirtualClass { private static List classes = new ArrayList(); private boolean isPrivate; private String className; private String methodName; //A private constructor private VirtualClass(String name, String method, boolean isP){ this.className = name; this.isPrivate = isP; this.methodName = method; } private void setClassName(String className){ this.className = className; } private void getClassName(){ return className; } public static VirtualClass createClass(String name, String method, boolean isP){ VirtualClass virtualClass = new VirtualClass(String name, String method, boolean isP); classes.add(virtualClass); return virtualClass; } } 

现在你的代码完成的方式,问题可以在你的客户端类的很多地方。 这种结构更安全并且通常使用。

此外,您不应该使用ArrayList键入集合,而是使用实现的接口,List。 如何使用数组列表?