このエラーを正しく説明する方法が本当にわかりません...
このメソッドをコントローラークラスに追加したときに始まりました。
public void loadPlayerComboBox() {
try{
final PreparedStatement collectPlayerNames =
ConnectionManager.getConnection().prepareStatement("SELECT "+PLAYER_NAME+" FROM PLAYERS");
final ResultSet playerNameResults = collectPlayerNames.executeQuery();
while(playerNameResults.next()){
IViewManager.Util.getInstance().getMyContainerPane().getMyPlayerManagerPane().getPlayerNameList()
.add(playerNameResults.getString(PLAYER_NAME));
}
}catch(final SQLException e){
System.out.println("SQLException. Reason: " + e.getMessage());
}
}
そして、このメソッド(プログラムの起動時にクラスによって呼び出される)がなければ、エラーが発生しないことを確認しました。
私のエラー?Eclipseから実行すると、プログラムはフレームのトップバーの読み込みを開始しますが、実際のコンテンツは表示されません。
これに加えて、奇妙な溺れている空の箱があります。これは、複数のプロセスが起動されていることが原因であると私は信じています。
これは、getInstance()メソッドが相互に再帰的に呼び出したため、スタックオーバーフローが原因であると考えています。何らかの理由でスタックトレースを取り戻すことができず、現時点ではデバッグ画面が空白になっています。.logを確認しましたが、そのタイムスタンプに対応するエラーはありません。でも、どうやってお互いを呼ぶことができるのかわかりません。ViewManagerメソッドは次のとおりです。
static class Util {
static private IViewManager viewManager = null;
static public synchronized IViewManager getInstance() {
if (viewManager == null) {
viewManager = new ViewManager();
}
return viewManager;
}
}
そしてコンストラクター:
public ViewManager(){
super("Tony Larp DB Manager");
this.setVisible(true);
this.setDefaultCloseOperation(3);
myContainerPane = new ContainerPane();
myContentMenu = new ContentMenu();
IController.Util.getInstance();
IPlayerCharacterManager.Util.getInstance();
this.setJMenuBar(myContentMenu);
this.getContentPane().add(myContainerPane);
this.pack();
}
IController.Util.getInstance()メソッドは、呼び出すクラスとオブジェクトの名前が異なることを除いて、同じです。ダブルチェックロックにより、ランチャーのIViewManager.getInstance()の最初のインスタンスがnullポインターを返します。これは、同期されたブロックの開始時です。
明確にするために、プログラムはIViewManager.Util.getInstance()
ランチャーで最初に呼び出し、次にIController.Util.getInstance()
上記のコンストラクターで初めて呼び出します。その後、それへのすべての呼び出しはインスタンスを返すだけです。
この種のエラーの原因は何ですか?どうすれば修正を開始できますか?