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

こんにちは。

私は現在、大学の卒業制作でiアプリを作っています。
問題が発生したので、どなたかご指導をお願いいたします。

i-appli Development Kitで、
--- ADFチェック 開始 ---
--- ADFチェック 終了 ---
--- ADF/トラステッド動作設定チェック 開始 ---
--- ADF/トラステッド動作設定チェック 終了 ---
と、正常にビルドされたにも関わらず、起動ボタンを押すと、
Main :java.lang.NullPointerException MainPage4
java.lang.NullPointerException
at com.nttdocomo.ui.Panel.add(+17)
at MainPage4.start(+7980)
com.nttdocomo.ui.Panel
というメッセージが表示され、エミュレータに何も映りません…。ちなみにMainPage4はプロジェクトのタイトルです。

なぜなのでしょうか?初心者ですので、どなたか分かりやすく教えてくださるとうれしいです!よろしくお願いします!

A 回答 (6件)

DojaのAPIをよく確認しましょう↓


http://www.tomicom.ac.jp/~koba/doja5/jguidefordo …

com.nttdocomo.ui.ListBoxにふさわしいAPIがあると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!

getItemとgetSelectedIndexを使ったら、できました♪

お礼日時:2008/12/28 18:36

おなじようなerrorのでるソースファイル書いてみました。


import com.nttdocomo.ui.*;


public class MainPage4 extends IApplication {
Label label;

public void start() {
Panel panel=new Panel();
panel.add(label);
Display.setCurrent(panel);
}
}
このソースで出たエラーは
Main :java.lang.NullPointerException MainPage4
java.lang.NullPointerException
at com.nttdocomo.ui.Panel.add(+17)
at MainPage4.start(+15)
com.nttdocomo.ui.Panel
です。

これは、Labelが初期化されてないせいですがーー
なにかコンポーネントの初期化をわすれてません。なお、このソースは
public class MainPage4 extends IApplication {
Label label=new Label("AAAA");

public void start() {
Panel panel=new Panel();
panel.add(label);
Display.setCurrent(panel);
}
}
となおしたら、正常に起動しました、
    • good
    • 0
この回答へのお礼

ありがとうございます!

SPsizeを変更したら、うまくいきました☆

お礼日時:2008/12/28 18:34

まず、スクラッチパッドの容量の限界は引き伸ばしても10kbまでです。


サイズがオーバーしてないか確認しましょう。

次に構造の問題なのですが、GUIは基本的に階層構造になってます。
なので、ただMainPage4のstartメソッドで
Panel p=new Panel();
とした場合では、MainPage4とPanel間にデータの受け渡しが一切ないため階層関係はできません。

MainPage4
|---------Panel←ここを参照したい

しかし、現状では

MainPage4
|---------Panel

Panel←ここに新しいオブジェクトを作って参照している

この問題の解決策としてPanelクラスにMainPage4クラスのデータを渡しましょう。
オブジェクト指向でいうところの"継承"を明示的にやっていることになります。

MainPage4クラス
public class MainPage4 extends IApplication implements ComponentListener{
Panel1 p1;
public void start(){
    //thisはMainPage4のデータ
p1=new Panel1(this);
}
}
Panel1クラス
public class Panel1 extends Panel{
MainPage4 mp4;
public Panel1(MainPage4 mp4){
this.mp4=mp4;
}
}
これでMainPage4がPanel1を持っている状態になります。(いわゆる、Has-is関係)

そして、パネルの遷移ですがGUIの構造としては、MainPage4はパネルの遷移をするだけのクラスになります。
通常のJavaのメインクラスもクラスの呼び出しとかだけで実際に処理は行ってないですよね?

そこでmainPage4で用意すべき変数とメソッドは以下のものとなります。
・指定したパネルに切り替えるためのフラグ(boolean)
・他のクラスからフラグを切り替えるためのセッターメソッド
・フラグがtrueならパネル切り替えを行うメソッド

private boolean changeP1=true,changeP2,...changeP15;
Panel1 p1;
.
.
Panel15 p15;
public void start(){
//パネル遷移しても状態を維持したいのならここで
//パネル遷移後に遷移したパネルを初期化したい場合はchangePanel内で
p1=new Panel1(this);
.
.
p15=new Panel15(this);
change();
}
public void change(){
if(changeP1==true){
//ここでfalseにしないと無限ループ
changePanel1(false);
//Panel1を画面に表示
Display.setCurrent(p1);
}
.
.
}
//外部からフラグを設定するためのセッターメソッド
public void changePanel1(boolean changeP1){
this.changeP1=changeP1;
}

外部クラスからPanel1に遷移をするさいは
mp4.changePanel1(true);
mp4.change();

理解しづらい点、不足な点などございましたら、返信ください。
    • good
    • 0
この回答へのお礼

>>zozyさん

わかりやすく教えてくださり、ありがとうございます!

SPsizeを10000に設定したら、正常に画面が映りました☆

でも、不思議なことに、映らなかったときのプロジェクトのSPsizeを10000にいきなりあげても正常に起動されなかったんですけど、だんだんScratchPadを増やし、それに伴って徐々にSPsizeを引き上げていったら成功しました。プロジェクトの中身は全く変わらないのに、手順が違うと上手く動かないのかなと思いました。でも、解決したので良かったです♪これで、先に進めます!

ただ、新たな問題が浮上したので、よろしければ、また教えて頂けるとうれしいです!何度も申し訳ありません…。

ScratchPadを使用する際、TextBoxからLabelに文字に移すのは
String SaveText = TextBox.getText();
のような形でできるのですが、
ListBoxから、選択された項目をLabelに移すにはどうしたら良いのでしょうか?一応、ListBox.CHOICEを使っています。
一度、
String SaveText = ListBox.getText();
としたら、エラーになりました。ちなみに、変数は実際のものと異なりますので、変えて答えていただいて大丈夫です!

ご存じでしたら、またお願いいたします!

お礼日時:2008/12/25 22:09

+7980 が「7980バイト目」という可能性ってありませんか? まあ, それがわかってどうなるものでもないような気はしますが.


というか, 「卒業制作」というなら大学の教員に聞けばいいのでは?
    • good
    • 0

Exceptionの内容みたままかと。



1:>Main :java.lang.NullPointerException MainPage4
2:>java.lang.NullPointerException
3:>at com.nttdocomo.ui.Panel.add(+17)
4:>at MainPage4.start(+7980)

1:MainPage4でNullPointerExceptionが発生しました。
2:例外の種類はNullPointerExceptionです。
3:例外が発生した箇所はcom.nttdocomo.ui.Panel.addの(+17)←たぶん行数だと思う。
4:3行目の処理の例外発生箇所はMainPage4.start(+7980)です。

コンパイルに問題はないとの事なので、単純に「3:」で参照されるオブジェクトがnullなのでしょう。
だから、そのオブジェクトが参照されるようにすればいいと思いますよ。参照されるオブジェクトは本当にnewされていますか?

この回答への補足

>>BleuLuneさん

わかりやすくご指摘していただき、ありがとうございます!

早速17行目を確認してみたところ、オブジェクトはnewで生成されてました…。何度も確認したんですけど、きちんと参照もされていると思います。それと、エラーのメッセージのat MainPage4.start(+7980)が、7980行もないのでよくわかりませんでした。

補足日時:2008/12/23 23:46
    • good
    • 0

エラー内容だけでは、よくわからないので見せられる範囲でソースなどを貼ってもらえるとありがたいです。



エラー内容からすると、MainPage4のstart()内で
Panelを配置してるようだけど、うまく配置できてない
というところでしょう。
なんにせよ、Dojaのエラーコードは見づらいです。

ここからは逆に質問ですが、
Q1.ページ遷移をする設計構造ですか?
(フレームへのパネルまたはキャンバスの追加のしかたが
間違ってるかもしれません。)

Q2.ADFの設定を正しくしてあるか?
AppName=プロジェクト名.jar
PackageURL=AppNameと同じ
AppClass=IApplicationを継承してるクラスのパス
プロジェクトA内のパッケージB内のMainFrameだったら
B.MainFrameになります。

この回答への補足

>>zozyさん

わかりやすいご回答ありがとうございます!

ADFの設定は大丈夫でした!

私が作っているプロジェクトはzozyさんのおっしゃるとおり、パネルのなかのリストボックスやボタンのコンポーネントを使ってページを切り替えていく仕組みです。

大ざっぱにソースコードをのせます。申し訳ないのですが、実際のものとは異なり、流れだけご説明させてください!ご指導をお願いいたします。

import com.nttdocomo.ui.*;
import javax.microedition.io.*;
import java.io.*;

public class MainPage4 extends IApplication implements ComponentListener {
private Panel //パネルを15こ用意
private ListBox //SINGLE_SELECTやCHOICEを用意
private Label
private TextBox /*ユーザーが入力したtextをScratchPadを使ってlabelに入れる仕組み*/
private Button //パネル遷移のためのボタン
private HTMLLayout

public void start() {
//ここからパネルのクラスを全て書き込んであります
//Label,ListBox,Buttonがあります
panel = new Panel();
//以下省略
//ここで、一番最初に表示したいパネルを表示します
Display.setCurrent(panel);
}
 // その後、アクションリスナーを実装します
public void componentAction(Component source, int type, int param) {
/*ボタンが押されたり、リストボックスでSELECTION_CHANGEDされたら違うパネルを表示します。*/
//それから、ScratchPadを使用する旨を書き込みます。
} //ここで、ComponentListenerのカッコを閉じます

//最後はScratchPadの中身です。
/*全部で39このScratchPadを書き込み、読み込みでそれぞれ別個に用意しました。("scratchpad:///0;pos=0")から("scratchpad:///0;pos=38")までです。*/
/*先ほど上で用意したTextBoxから3ケタの半角数字を空白のlabelにsetTextします*/
}

なんとなく、ScratchPadを追加して上書き保存した後から、エミュレータで表示されなくなった気がします…。最初、ScratchPadが5こ位のときは大丈夫だったんですけど、その後ScratchPadを増やしたらこのような問題が発生してしまったような感じがします。正常にビルドされているので、よく分からないのですが…。

補足日時:2008/12/24 00:36
    • good
    • 0

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