- ベストアンサー
new演算子が、インスタンスの参照を返さない!?
どうもこんにちは。 現在、iアプリ向けプログラムを作成しています。 しかし、あるクラスだけが、インスタンスを作成できない(?) ようです。 他のクラスの記述と、見比べても差がほぼありません。 コンストラクタの中に、何も書かないようにしたりしてもダメでした。 サンプルコードは、これです。 // ---------------------------------------------------------- // Window window = new Window( 10, 15+(15*6), D.WIN_FLAG_NOCONTROL, 8, 8, 8 ); System.out.println( "エフェクト"+ new Effect() ); //つまり、コンストラクタから参照が得られないのが、問題 Effect effect = new Effect(); System.out.println("effect:"+effect); // ---------------------------------------------------------- // まとめると、Windowクラスのインスタンスは、作れるのに、 Effectクラスは、作れないという事です。 new Effect()のところで、NullPointerException例外が、発生してしまいます。 下記は、Effectクラスのコンストラクタです。 //コンストラクタ Effect() { g = MainCanvas.g; nKey = MainCanvas.nKey; } 特に変わったところは、ありません。 コンストラクタ内の二行を消しても、同じ結果でした。 もしかして、KVMが、壊れたとかでしょうか? ヒープの容量も十分にあったので、それが問題では無いと思いますが、 どうでしょうか? 見直すポイントがあれば、教えて下さい。 お願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Effectクラスのstaticな部分またはインスタンスフィールドでnull参照をしてしまう処理はないでしょうか? 各クラスのstatic部分の処理は一番最初にクラスが参照されるときに発生します。インスタンスフィールドが初期化される処理はコンストラクタが呼び出され、コンストラクタの中の処理に入る直前です。
その他の回答 (5)
- isle
- ベストアンサー率51% (77/150)
回答じゃないんですが、 > StackTraceの貧弱さには、困りました・・・。 doja_g.exeなら詳細なスタックトレースが出力されるはずです。
- kztk
- ベストアンサー率53% (59/110)
StackTraceの内容って、それしか出ないんですか・・・KVMの仕様? この出力結果を見る限りだと、NullPointerExceptionの発生箇所は effect = new Effect(); だけでなく System.out.println( "effect:"+ effect ); も候補になると思います。 EffectクラスはtoString()を実装していますか?
お礼
ありがとうございます。 問題は、解決しました!! ちなみにEffectは、自動的にObjectクラスを継承している はずですから、使えると思います。 StackTraceの貧弱さには、困りました・・・。
- PED02744
- ベストアンサー率40% (157/390)
>ちなみに、新しいインスタンスが生成されない様にとは クラスがabstract宣言されている場合、インスタンス化できませんので、 public abstract class Effect { } と宣言されていると、インスタンス化できなくなります。
お礼
お手数お掛けしました。 問題は、解決したようです。 ちなみに、Effectは、普通のクラス宣言でした。 またいつの日か、よろしくおねがいします。
- PED02744
- ベストアンサー率40% (157/390)
iアプリということは、DoJaだと思いますが、 CLDC1.1にはWindowクラスもEffectクラスもAPIリファレンスには載っていません。 DoJa5.0APIリファレンスにも載っていないクラスなのですが。 もし、独自で作成されたクラスであるならば、新しいインスタンスが生成されないように、クラスに記載されているのではないでしょうか?
補足
回答ありがとうございます。 確かに、WindowとEffectは、独自に作りました。 ちなみに、新しいインスタンスが生成されない様にとは、 どういった状態のことなのでしょうか? Singletonパターンの様に、コンストラクタをprivate指定している わけではないです。 ちなみに、コンストラクタは、アクセス指定しませんでした。 試しに、public指定しましたが、結果は同じでした。 似たような例として、インスタンス生成の為に、 getInstance()みたいなメソッドを作ったわけでもありません。 以上です。 よろしくお願いします。
- kztk
- ベストアンサー率53% (59/110)
Effectクラスのコンストラクタを空にしても、new Effect()でNullPointerExceptionが発生するというのならば、Effectが継承するスーパークラスのコンストラクタでNullPointerExceptionが発生しているくらいしか考えにくいと思いますが・・・。 NullPointerExceptionが発生した時のStacktraceを載せていただけますか?
補足
>Effectが継承するスーパークラスのコンストラクタで>NullPointerExceptionが発生しているくらいしか考えにくいと >思いますが・・・。 という事は、Effectクラスは、特に継承させていませんので、 Objectクラスで、何か起こっている(?)という事になるのでしょうか? >NullPointerExceptionが発生した時の >Stacktraceを載せていただけますか? という事で、下記の様にコードを記述してみました。 //---------------------------------------------------------- // Effect effect = null; try { effect = new Effect(); System.out.println( "effect:"+ effect ); } catch( NullPointerException e ) { System.out.println( "exception: " + e.getMessage() ); e.printStackTrace(); } これが、出力された内容です。 exception: null java.lang.NullPointerException //----------------------------------------------------- // e.printStackTrace()ですが、あまり良く機能をわかっていません。 iアプリの開発といえども、もっと詳しく出力できるのでしょうか? ちなみに、開発に使用している環境は、Doja-4.1です。 以上です。よろしくお願いします。
お礼
回答ありがとうございます。 bgbgさんのご指摘に従って、 インスタンスフィールドの初期値設定を全て 初期化処理の時に行う様にしたところ、問題が解決しました。 ありがとうございます。 助かりました。