こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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が、壊れたとかでしょうか?
ヒープの容量も十分にあったので、それが問題では無いと思いますが、
どうでしょうか?

見直すポイントがあれば、教えて下さい。
お願いします。

投稿日時 - 2007-08-02 14:47:27

QNo.3221103

すぐに回答ほしいです

質問者が選んだベストアンサー

Effectクラスのstaticな部分またはインスタンスフィールドでnull参照をしてしまう処理はないでしょうか?
各クラスのstatic部分の処理は一番最初にクラスが参照されるときに発生します。インスタンスフィールドが初期化される処理はコンストラクタが呼び出され、コンストラクタの中の処理に入る直前です。

投稿日時 - 2007-08-02 16:31:03

お礼

回答ありがとうございます。

bgbgさんのご指摘に従って、
インスタンスフィールドの初期値設定を全て
初期化処理の時に行う様にしたところ、問題が解決しました。

ありがとうございます。
助かりました。

投稿日時 - 2007-08-02 16:59:11

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

回答じゃないんですが、

> StackTraceの貧弱さには、困りました・・・。

doja_g.exeなら詳細なスタックトレースが出力されるはずです。

投稿日時 - 2007-08-02 18:05:42

ANo.4

StackTraceの内容って、それしか出ないんですか・・・KVMの仕様?
この出力結果を見る限りだと、NullPointerExceptionの発生箇所は
  effect = new Effect();
だけでなく
  System.out.println( "effect:"+ effect );
も候補になると思います。
EffectクラスはtoString()を実装していますか?

投稿日時 - 2007-08-02 16:24:43

お礼

ありがとうございます。
問題は、解決しました!!

ちなみにEffectは、自動的にObjectクラスを継承している
はずですから、使えると思います。

StackTraceの貧弱さには、困りました・・・。

投稿日時 - 2007-08-02 17:01:00

ANo.3

>ちなみに、新しいインスタンスが生成されない様にとは
クラスがabstract宣言されている場合、インスタンス化できませんので、
public abstract class Effect {
}
と宣言されていると、インスタンス化できなくなります。

投稿日時 - 2007-08-02 16:13:30

お礼

お手数お掛けしました。
問題は、解決したようです。

ちなみに、Effectは、普通のクラス宣言でした。

またいつの日か、よろしくおねがいします。

投稿日時 - 2007-08-02 17:03:10

ANo.2

iアプリということは、DoJaだと思いますが、
CLDC1.1にはWindowクラスもEffectクラスもAPIリファレンスには載っていません。
DoJa5.0APIリファレンスにも載っていないクラスなのですが。

もし、独自で作成されたクラスであるならば、新しいインスタンスが生成されないように、クラスに記載されているのではないでしょうか?

投稿日時 - 2007-08-02 15:34:44

補足

回答ありがとうございます。

確かに、WindowとEffectは、独自に作りました。
ちなみに、新しいインスタンスが生成されない様にとは、
どういった状態のことなのでしょうか?

Singletonパターンの様に、コンストラクタをprivate指定している
わけではないです。

ちなみに、コンストラクタは、アクセス指定しませんでした。
試しに、public指定しましたが、結果は同じでした。

似たような例として、インスタンス生成の為に、
getInstance()みたいなメソッドを作ったわけでもありません。

以上です。
よろしくお願いします。

投稿日時 - 2007-08-02 15:47:43

ANo.1

Effectクラスのコンストラクタを空にしても、new Effect()でNullPointerExceptionが発生するというのならば、Effectが継承するスーパークラスのコンストラクタでNullPointerExceptionが発生しているくらいしか考えにくいと思いますが・・・。

NullPointerExceptionが発生した時のStacktraceを載せていただけますか?

投稿日時 - 2007-08-02 15:00:24

補足

>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です。
以上です。よろしくお願いします。

投稿日時 - 2007-08-02 15:29:32

あなたにオススメの質問