【问题标题】:reference on Object which was transfered as parameter对作为参数传输的对象的引用
【发布时间】:2012-04-07 21:45:57
【问题描述】:

第三个代码示例包含错误 - 如何解决?

在下面的代码中,我生成了一个名为“生成器”的方法。 该方法接收一个 JTextField 和一个 JLabel 作为参数。

它生成单独的 JPanel 并将它们添加到另一个 JPanel(带有边框“Vermieter”的那个)。 结果应如下所示(标记为红色):

http://imageshack.us/photo/my-images/853/stammdateneraffsenguibe.png/

这里我将 JTextFields 实例化为字段:

private JTextField txtplzvermieter;
private JTextField txtemailvermieter;
private JTextField txtgeburtsdatumvermieter;
private JTextField txthandyvermieter;
private JTextField txtidvermieter;
private JTextField txtnamevermieter;
private JTextField txtortvermieter;
private JTextField txtstrassevermieter;
private JTextField txttelefonvermieter;
private JTextField txtvornamevermieter;

我在这里调用我上面描述的方法

        public  void vermieterPanel(JPanel verPanel){
         verPanel.add(generator( "ID", txtidvermieter ));
       verPanel.add(generator("Name", txtnamevermieter ));
       verPanel.add(generator( "Vorname", txtvornamevermieter ));
       verPanel.add(generator( "Straße", txtstrassevermieter ));
       verPanel.add(generator("PLZ", txtplzvermieter ));
       verPanel.add(generator( "Ort", txtortvermieter ));
       verPanel.add(generator( "Geburtsdatum", txtgeburtsdatumvermieter ));
       verPanel.add(generator( "Telefon", txttelefonvermieter ));
       verPanel.add(generator("Handy", txthandyvermieter ));
       verPanel.add(generator( "E-Mail", txtemailvermieter ));

这是包含错误的方法生成器:

      public JPanel generator(String lableText, JTextField s){   // generiert ein Panel mit einer Zeile aus lable + TextFeld

     JPanel gens = new JPanel();
     JLabel lable = new JLabel(lableText);
     lable.setPreferredSize(new Dimension(100,25));

     s = new JTextField();
     s.setPreferredSize(new Dimension(200, 25));


    gens.add(lable);
    gens.add(s);
    return gens;
  }

后来我无法使用.getText(); 获得对我的 TeftFields 的引用,因为我在这里创建了对新 JTextField-Object 的引用 s = new JTextField();

如果我删除该行以访问我的对象,我会得到一个空指针异常。

我做错了什么?

【问题讨论】:

    标签: java object reference


    【解决方案1】:

    当然你会得到一个异常,因为你在初始化之前传递了 JTextield!!
    你只是在声明它,
    在将其作为参数传递之前,使用 new 关键字对其进行初始化。

    【讨论】:

    • 哎呀。忘记提及调用引用 JTextFields 的方法 initComponents。即使我这样声明 JTextFields: private JTextField txtplzvermieter = new JTextField();私人 JTextField txtemailvermieter=new JTextField();私人 JTextField txtgeburtsdatumvermieter=new JTextField();私人 JTextField txthandyvermieter=new JTextField();私有 JTextField txtidvermieter = new JTextField();我仍然得到相同的 NullPointer
    • 调试代码并在生成器入口处监控你的字段,看看发生了什么
    • 谢谢!当我调试时,我看到生成器()方法很好!错误在这里: mieterPanel(mietPanel); mieterPanel(mietObjektPanel);第二行导致错误,因为“mietObjektPanel”仅包含一些随机内容(导致我认为是空指针)并将其添加到 mieterPanel 而不是新面板...当我创建一个新面板并使用 generator() 构建 mietObjektPanel -methode 它就像一个魅力。以前从未使用过调试器,所以我学习了一项新技能 - thx
    【解决方案2】:

    java 中,您不能将对象作为引用传递,它永远不会发生
    这是创建 java 语言的目的,最小化内存管理
    如果将对象作为参数传递,则会传递对象引用的副本
    所以对象fields 上的每一个变化都会被反映,除非用new 关键字分配一个新对象,在这里你将失去你的对象 尝试将您的 JField 设为全局 class fields 并且不要通过参数部分将它们传递给方法。

    【讨论】:

    • 谢谢 - 这非常有用!我的 JFields 已经是全局类字段了!如果我无法传递对象上的引用,我该如何编写通用的方法“生成器”,以便它为每个 TextFields 生成 JPanel(带有 JLabel 和 JTextfield)?
    【解决方案3】:

    永远不会产生原始值。你需要这样做

    private JTextField txtplzvermieter = new JTextField();
    

    为他们每个人。但它必须在方法之外,而不是在内部。

    【讨论】:

    • 感谢您的建议,但我已经尝试过了。如果我删除该行,那么我会在 database.Gui.generator(Gui.java:192) 在 database.Gui.mieterPanel(Gui.java: 173) 在 database.Gui.stammdatenErfassen(Gui.java:139) 在 database.Gui.actionPerformed(Gui.java:241)
    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多