- ベストアンサー
正常にビルドされたのに起動されません
こんにちは。 私は現在、大学の卒業制作で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はプロジェクトのタイトルです。 なぜなのでしょうか?初心者ですので、どなたか分かりやすく教えてくださるとうれしいです!よろしくお願いします!
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
まず、スクラッチパッドの容量の限界は引き伸ばしても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(); 理解しづらい点、不足な点などございましたら、返信ください。
その他の回答 (5)
- zozy
- ベストアンサー率60% (20/33)
DojaのAPIをよく確認しましょう↓ http://www.tomicom.ac.jp/~koba/doja5/jguidefordoja5api/javadoc/overview-summary.html com.nttdocomo.ui.ListBoxにふさわしいAPIがあると思います。
お礼
ありがとうございます! getItemとgetSelectedIndexを使ったら、できました♪
- inu_poti
- ベストアンサー率66% (4/6)
おなじような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); } } となおしたら、正常に起動しました、
お礼
ありがとうございます! SPsizeを変更したら、うまくいきました☆
- Tacosan
- ベストアンサー率23% (3656/15482)
+7980 が「7980バイト目」という可能性ってありませんか? まあ, それがわかってどうなるものでもないような気はしますが. というか, 「卒業制作」というなら大学の教員に聞けばいいのでは?
- BleuLune
- ベストアンサー率57% (15/26)
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行もないのでよくわかりませんでした。
- zozy
- ベストアンサー率60% (20/33)
エラー内容だけでは、よくわからないので見せられる範囲でソースなどを貼ってもらえるとありがたいです。 エラー内容からすると、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を増やしたらこのような問題が発生してしまったような感じがします。正常にビルドされているので、よく分からないのですが…。
お礼
>>zozyさん わかりやすく教えてくださり、ありがとうございます! SPsizeを10000に設定したら、正常に画面が映りました☆ でも、不思議なことに、映らなかったときのプロジェクトのSPsizeを10000にいきなりあげても正常に起動されなかったんですけど、だんだんScratchPadを増やし、それに伴って徐々にSPsizeを引き上げていったら成功しました。プロジェクトの中身は全く変わらないのに、手順が違うと上手く動かないのかなと思いました。でも、解決したので良かったです♪これで、先に進めます! ただ、新たな問題が浮上したので、よろしければ、また教えて頂けるとうれしいです!何度も申し訳ありません…。 ScratchPadを使用する際、TextBoxからLabelに文字に移すのは String SaveText = TextBox.getText(); のような形でできるのですが、 ListBoxから、選択された項目をLabelに移すにはどうしたら良いのでしょうか?一応、ListBox.CHOICEを使っています。 一度、 String SaveText = ListBox.getText(); としたら、エラーになりました。ちなみに、変数は実際のものと異なりますので、変えて答えていただいて大丈夫です! ご存じでしたら、またお願いいたします!