0

我尝试将文本区域中的所有行读入 StringBuilder 以便我可以将文本区域中的文本用作整个字符串。但是我在 s.append(line);行中得到了 NullPointerException . 为什么?

public class tu extends JFrame implements ActionListener{

    JTextArea t;
    static StringBuilder s;

    tu (){

        setLayout(/*new BorderLayout()*/null);
        t=new JTextArea(30,77);
        JScrollPane s=new JScrollPane(t,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        JButton b=new JButton("process");
        b.addActionListener(this);
        JPanel p=new JPanel();
        JPanel p1=new JPanel();
        p.add(s);
        p.setBorder(new TitledBorder("sequence"));
        p.setBounds(0,0,880,540);
        p1.add(b);
        p1.setBounds(380,570,100,40);
        add(p);
        add(p1);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(900,700);
        setVisible(true);

    }
     public void actionPerformed(ActionEvent e){
         String text=t.getText();
         while (text!=null){for (String line : text.split("\\n")){ 
         s.append(line);
         }}

     }


    public static void main(String[] args){
        tu t=new tu();

    }
}
4

2 回答 2

2

尝试调用尚未实例化的对象上的任何方法将导致NPE. 您需要实例化您的StringBuilder s

StringBuilder s = new StringBuilder();

你真的要等到用户点击了JButton之后再建立这个的内容StringBuilder吗?StringBuilders通常用作具有本地范围的按需助手对象。


有几点需要注意:

  • 使用static成员变量被认为是糟糕的设计
  • 类名以大写字母开头
  • 不要使用绝对定位(null布局)。改用布局管理
  • 首选的方法是创建一个JFrame直接 & 使用的实例。
  • 的首选方法ActionListeners是使用匿名实例或Action接口。
  • 考虑使用初始线程
于 2013-02-09T11:29:03.053 回答
1

当您要写入时,您的 StringBuilder 仍然为空。

您需要在附加之前实例化您的 StringBuilder 。

s = new StringBuilder();

顺便说一句,您的 StringBuilder 和您的 JScrollPane 具有相同的变量名称,您应该使用不同的名称。

于 2013-02-09T11:31:06.073 回答