当前页面: 开发资料首页 → J2ME 专题 → [菜鸟问题]各位高手帮我看下出现异常:java.lang.NullPointerException是怎么回事啊(JB中编译通过)
[菜鸟问题]各位高手帮我看下出现异常:java.lang.NullPointerException是怎么回事啊(JB中编译通过)
摘要: [菜鸟问题]各位高手帮我看下出现异常:java.lang.NullPointerException是怎么回事啊(JB中编译通过)
=============
ok3.java
=============
package ok3;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ok3 extends MIDlet {
private Canvas canvas;
private Display display;
static ok3 instance;
ok3Displayable displayable = new ok3Displayable();
public ok3() {
instance = this;
}
public void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
canvas = new ok3Displayable();
display.setCurrent(canvas);
}
public void pauseApp() {
}
public void destroyApp(boolean bool) {
}
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}
==================
ok3Displayable
==================
package ok3;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.util.*;
import java.io.*;
public class ok3Displayable extends Canvas implements CommandListener {
public ok3Displayable() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
setCommandListener(this);
addCommand(new Command("Exit", Command.EXIT, 1));
}
public void commandAction(Command command, Displayable displayable) {
if (command.getCommandType() == Command.EXIT) {
ok3.quitApp();
}
}
private Image kk = null;
public void ok3Displayable(){
try {
kk = Image.createImage("/ohyeah.png");
}
catch(IOException e) {
e.printStackTrace();
}
}
protected void paint(Graphics g) {
g.setColor(221, 71, 71); // red
g.drawArc(50,20,25,25,0,360);
g.fillRect(23, 33, 30, 80);
g.drawImage(kk,20,20,Graphics.LEFT | Graphics.TOP );
g.setColor(255, 255, 255); // red
g.drawString("hello !",10,20,0);
}
}
JB2006下编译通过,但是NOKIA7210模拟器环境运行时出现“Application Eorrer”,点击“Details”出现异常报告:java.lang.NullPointerException
请问我到底哪儿出了问题呢……
private Canvas canvas;
ok3Displayable displayable = new ok3Displayable();
canvas = new ok3Displayable();
----------------------------------------
程序写成这样也能编译过去?????
呵呵,理论上来说是可以编过去的,只是我想空指针不一定在这
应该debug看看到底那里空了
对象没有初始化就使用了
同意楼上
楼主可以加入此语句:
例如test对象,test= new Test(null);
请问二楼的朋友k7sem兄,我的程序这样写是为什么不行呢?我是菜鸟,你就简单说说就好了~
private Canvas canvas;
ok3Displayable displayable = new ok3Displayable();
canvas = new ok3Displayable();
另外谢谢5、6楼的朋友ty001给我支招,但是我还是想问一下这一步是做什么用的呢?
另外你说加入此语句,那么应该加在哪里呢?
十分抱歉提出这种初级死了的问题……但这的确是我目前最大的问题!
再次谢谢各位了!
这一句当然是加在你声明对象的地方啦
另外你的代码里面有好几个对象都没有初始化就使用了
你单步调试一下就会发现不少问题
对象没有初始化就使用了
感谢ty001兄一直关注我的问题,现在我把程序简化了一下使它看起来不会太长,并且把没用的东西都删了。各位老大这回再帮我看看,到底是哪个对象没有初始化或者错误使用~~~~
=========
ok3.java
=========
package ok3;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ok3 extends MIDlet {
private Canvas canvas;
private Display display;
public void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
canvas = new ok3Displayable();
display.setCurrent(canvas);
}
public void pauseApp() {}
public void destroyApp(boolean bool) throws MIDletStateChangeException {
}
}
====================
ok3Displayable.java
====================
package ok3;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.io.*;
public class ok3Displayable extends Canvas {
private Image kk;
public void ok3Displayable(){
try {
kk = Image.createImage("/ohyeah.png");
}
catch(IOException e) {e.printStackTrace();}
}
protected void paint(Graphics g) {
g.drawImage(kk,20,20,Graphics.LEFT | Graphics.TOP );
}
}
谢谢各位了!
你的ok3Displayable()的构造没有被执行,所以kk这个对象没有初始化,就报错了。具体没执行的原因,尚不清楚,呵呵。
原因找到了
你的ok3Displayable 构造器前面竟然用void来修饰,虚拟机肯定是当成一个方法来处理的。并不是当成构造器去执行,所以构造没有被执行。去掉void关键字,问题解决了。
k7sem兄太棒了!真的是这样!太谢谢你了!!
问题已解决!