【问题标题】:Anonymous ActionListener Class Exception "NullPointerException"匿名 ActionListener 类异常“NullPointerException”
【发布时间】:2013-11-01 06:48:30
【问题描述】:

在for循环中,我想

  • 初始化 JButtons [] bts .
  • 将按钮添加到面板pan3
  • 为每个 JButton 添加一个 ActionListener

这是我到目前为止所得到的:

for(int i = 0 ;i < bts1.length ; i++){
        bts1[i] = new JButton(""+i);
        pan3.add(bts1[i]);
        //The NullPointerException happens after this line . 
        bts[i].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae){
                int j = 0 ;
                screen.setText(screen.getText()+bts[j].getText());
                j++;
            }
        });
    }

我的问题是如何解决 NullPointerException ? 注意 对于 j 我添加它是因为当我尝试使用 i 时,会发生编译器错误,

【问题讨论】:

  • j 对于 setText 内容将始终为零。你想用它做什么?
  • 不,它会随着 j++ 的编写而增加 1
  • 那么它会立即超出范围并被遗忘。而且,下一次它会重置为 0。
  • @user949300 知道了,谢谢

标签: java swing nullpointerexception actionlistener anonymous-class


【解决方案1】:

您将JButton 初始化为bts1 并将其称为bts。我认为这导致了错误。
还有,

int i=0; 声明为全局范围for(i = 0 ;i &lt; bts1.length ; i++),然后您可以使用i 而不是j
否则使用如下:

for(int i = 0 ;i < bts1.length ; i++){
        bts1[i] = new JButton(""+i);
        pan3.add(bts1[i]);
        final int j=i; 
        bts1[i].addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae){                   
                screen.setText(screen.getText()+bts1[j].getText());
            }
        });
    }

【讨论】:

  • 使用final修饰符这样他就可以使用i是个好点:)
  • 谢谢。现在可以了,你能解释一下为什么在这里使用 final 修饰符吗?
  • 您可以在这里找到问题的答案:stackoverflow.com/questions/3910324/…
【解决方案2】:

您正在使用两个不同的 JButton 数组,btsbts1

  • 在您的循环中,您正在创建一个 JButton 并将其分配给 bts1[i]
  • 在 ActionListener 部分,您正在访问 bts[j]

您是否也在某处初始化了bts[j]?如果没有,您将遇到 NPE。

【讨论】:

    【解决方案3】:

    改用事件源

    screen.setText(screen.getText()+((JButton)ae.getSource()).getText());
    

    【讨论】:

    • 如果您添加更多关于这两者之间区别的解释,我会更好地理解它
    • 可以使用事件源——被点击的按钮实例。
    【解决方案4】:
    try this:
    for(int i = 0 ;i < bts1.length-1 ; i++){
       //rest of your code
    }
    

    因为 10 个元素的数组中的元素索引为 0 到 9,而不是 0 到 10。

    【讨论】:

      【解决方案5】:

      在您将按钮添加到面板之前。您需要先为按钮添加监听器。

      先试试下面的代码。

          //The NullPointerException happens after this line . 
          bts[i].addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent ae){
                  int j = 0 ;
                  screen.setText(screen.getText()+bts[j].getText());
                  j++;
              }
          });
      
          **pan3.add(bts1[i]);**
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        相关资源
        最近更新 更多