-2

以下のコード「Boxlayout の例は適切に準拠していますが、実行時に以下の例外がスローされます。

Exception in thread "main" java.lang.NullPointerException

at java.awt.Container.addImpl(Container.java: 1027)
at java.awt.Container.add(Container.java: 935)
at javax.swing.JFrame.addImpl(JFrame.java: 545)
at java.awt.Container.add(Container.java: 352)
at BoxExample.launchFrame(BoxExample.java:26)
at BoxExample.main(BoxExample.java:40)

私の人生のほぼ1日を無駄にしたので、これを整理するのを手伝ってください..

//Boxlayout example

import java.awt.*;

import javax.swing.*;

public class BoxExample
{

public JFrame f;

public JButton b1, b2,b3,b4,b5;

public BoxExample()

{

f=new JFrame("Box example");

f.setTitle("Box Layout Example");

f.setSize(150, 150);

JButton b1=new JButton("Button 1");

JButton b2=new JButton("Button 2");

JButton b3=new JButton("Button 3");

JButton b4=new JButton("Button 4");

JButton b5=new JButton("Button 5");

}


public void launchFrame()

{

System.out.println("inside lf");

f.setLayout(new BoxLayout(f,BoxLayout.Y_AXIS));

System.out.println("after layset");

f.add(b1);

f.add(b2);

f.add(b3);

f.add(b4);

f.add(b5);

f.pack();

f.setVisible(true);

}


public static void main(String args[])

{

BoxExample guiWindow=new BoxExample();

System.out.println("main");

guiWindow.launchFrame();

}

}
4

1 に答える 1

1

一部の変数、主に JButton 変数 b1、b2、b3、b4、および b5 を、クラスで宣言し、コンストラクターで再宣言して初期化することにより、シャドーイングしています。コンストラクターで新しく宣言された変数は、クラスで宣言された変数と同じではないため、クラス変数は null のままになります。

解決策: コンストラクターで変数を再宣言しないでください。したがって、これの代わりに:

class Foo {
  private Bar bar;

  public Foo() {
    Bar bar = new Bar(); // bar is re-declared here!
  }
}

これを行う:

class Foo {
  private Bar bar;

  public Foo() {
    bar = new Bar(); // notice the difference!
  }
}

また、NullPointerException (NPE) が発生した場合は常に、例外をスローする行 (ここでは BoxExample クラスの 26 行目) を注意深く見てください。

at BoxExample.launchFrame(BoxExample.java:26)

その行で、変数の 1 つが null であることがわかります。どの変数かがわかれば、多くの場合、コードをさかのぼって、それが null である理由を確認できます。

于 2012-07-22T02:47:22.130 に答える