Java hiddenText=ca.a.getText();给出NullPointerException?

Java hiddenText=ca.a.getText();给出NullPointerException?,java,Java,编辑:谢谢你所有的答案,真的帮了很多忙,还有一些很好的建议 大家好,, 我是这里的新手,对Java编程还不熟悉,所以我会尽可能地提供相关信息 我的问题是我试图创建两个类,第一个类(ClassA)是GUI,第二个类(ClassB)是(ClassA)的逻辑 我的代码的一个简单示例是:- ClassA import javax.swing.*; import java.awt.*; public class ClassA extends JFrame { JTextField a = new J

编辑:谢谢你所有的答案,真的帮了很多忙,还有一些很好的建议

大家好,, 我是这里的新手,对Java编程还不熟悉,所以我会尽可能地提供相关信息

我的问题是我试图创建两个类,第一个类(ClassA)是GUI,第二个类(ClassB)是(ClassA)的逻辑

我的代码的一个简单示例是:-

ClassA

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

public class ClassA extends JFrame {


JTextField a = new JTextField();

JButton but = new JButton("Click");

ClassB cb = new ClassB();


public ClassA() {
    setTitle("Test");
    setLookAndFeel();
    setSize(250, 100);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout mainGrid = new GridLayout(1, 1, 20, 20);
    setLayout(mainGrid);


    add(a);
    add(but);
    but.addActionListener(cb);
    setVisible(true);
}


private void setLookAndFeel() {
    try {
        UIManager.setLookAndFeel(
                "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
                );
    } catch (Exception exc) {
        //ignore error
    }
}

public static void main(String[] args) {
    ClassA Alch = new ClassA();
}

}
ClassB

import java.awt.event.*;

public class ClassB implements ActionListener{
String command;
String text;

ClassA ca;



@Override
public void actionPerformed(ActionEvent event) {
    command = event.getActionCommand();
    if (command.equals("Click")) {
        text = ca.a.getText();
        System.out.println(text);
    }

}
}
我遇到的问题是让ClassB阅读JTextField a

如果我拆下这条线

text = ca.a.getText();
和使用

System.out.println(command);
它会单击输出,因此代码的其余部分似乎可以工作,但只要我添加

text = ca.a.getText();
当我使用“单击”按钮时,会出现NullPointerException


所以问题是我应该如何编写代码来让ClassB读取JTextField并输出它?

您有
ClassA
变量
ca
,但您还没有初始化它。因此,首先需要初始化
ca
变量才能使用它

ClassA ca - new ClassA();

与您的问题无关,但正如您所说,您是java新手,所以。永远记住,在逻辑类中永远不要有接口类的实例变量。这是个糟糕的设计


我建议您找到一些关于MVC设计模式的好文章,然后跳回OOP。创建坚固的基础总是更好的:

< P> <代码> CA>代码>变量从未初始化。您需要在
ClassB
中的某个地方添加类似
ClassA ca=new ClassA()
的内容—可能是在构造函数中

澄清编辑

根据评论:

如果变量在构造函数中初始化,则需要使用
ca=new ClassA()
,否则变量的作用域将仅限于构造函数中。例如:

public ClassB() {
    ca = new ClassA();
}
但是,如果出于任何原因不希望添加构造函数,也可以修改变量的现有声明:

public class ClassB implements ActionListener{
    String command;
    String text;
    ClassA ca = new ClassA();
    ...
}

首先,您必须在ClassB中创建ClassA的实例:

ClassA ca = new ClassA();
然后你应该知道ca是一个实例变量,如果你不初始化一个实例变量,它会得到空值

提示:最好将实例变量设置为私有,并通过getter和setter方法访问它们:

private JTextField txtField1 = new JTextField();

private JButton btnAction1 = new JButton("Click");

private ClassB cb = new ClassB();

public JTextField getTxtField1() {
    return txtField1;
}

您可以通过调用
cb.ca=this
来初始化ClassA构造函数中ClassB的字段
ca
,但这有点脏。字段应该几乎总是私有的,即。E无法从课堂外访问

解决这个问题的最好方法是忘记ClassB,使用匿名类代替它。在ClassA的构造函数中添加ActionListener的新匿名实现

but.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent event) {
        command = event.getActionCommand();
        if (command.equals("Click")) {
            String text = a.getText();
            System.out.println(text);
        }
});
或者,您可以将标签作为参数提供给ClassB的构造函数,并将其保存到(ClassB的)字段中


如果在类B的构造函数中执行
ClassA ca=new ClassA()
,则将创建一个作用域为构造函数的变量,该构造函数会隐藏该类中的
ca
字段。这就是like一词所表示的。显然,如果它在构造函数中,它应该是
ca=new ClassA()
,而OP可以修改变量的声明,在那里它将是
ClassA ca=new ClassA()。但是,由于OP确实声称是新的语言,我会更新我的帖子更清楚。
private JTextField field;

public ClassB(JTextField field) {
    this.field = field;
}