アプリ版:「スタンプのみでお礼する」機能のリリースについて

どうもこんにちは。

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

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

A 回答 (6件)

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

補足日時:2007/08/02 15:29
    • good
    • 0

iアプリということは、DoJaだと思いますが、


CLDC1.1にはWindowクラスもEffectクラスもAPIリファレンスには載っていません。
DoJa5.0APIリファレンスにも載っていないクラスなのですが。

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

この回答への補足

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

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

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

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

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

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

補足日時:2007/08/02 15:47
    • good
    • 0

>ちなみに、新しいインスタンスが生成されない様にとは


クラスがabstract宣言されている場合、インスタンス化できませんので、
public abstract class Effect {
}
と宣言されていると、インスタンス化できなくなります。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2007/08/02 17:03

StackTraceの内容って、それしか出ないんですか・・・KVMの仕様?


この出力結果を見る限りだと、NullPointerExceptionの発生箇所は
  effect = new Effect();
だけでなく
  System.out.println( "effect:"+ effect );
も候補になると思います。
EffectクラスはtoString()を実装していますか?
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2007/08/02 17:01

Effectクラスのstaticな部分またはインスタンスフィールドでnull参照をしてしまう処理はないでしょうか?


各クラスのstatic部分の処理は一番最初にクラスが参照されるときに発生します。インスタンスフィールドが初期化される処理はコンストラクタが呼び出され、コンストラクタの中の処理に入る直前です。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2007/08/02 16:59

回答じゃないんですが、



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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!