Java me try/catch在javame中没有任何作用
因此,我有以下代码:Java me try/catch在javame中没有任何作用,java-me,try-catch,midp,lcdui,nokia-s40,Java Me,Try Catch,Midp,Lcdui,Nokia S40,因此,我有以下代码: public class Minesweeper extends MIDlet implements CommandListener { public static String error = ""; public void startApp() throws MIDletStateChangeException { Display display = Display.getDisplay(this); canvas = new MCanvas
public class Minesweeper extends MIDlet implements CommandListener {
public static String error = "";
public void startApp() throws MIDletStateChangeException {
Display display = Display.getDisplay(this);
canvas = new MCanvas();
canvas.addCommand(exitCommand);
canvas.addCommand(okCommand);
canvas.addCommand(newCommand);
canvas.setCommandListener(this);
try{
display.setCurrent(canvas);
} catch (Exception e) {
error = e.toString();
}
}
}
当我离开display.setCurrent(画布)时
在try块之外,应用程序失败,出现NullPointerException
。当我注释掉这一行时,这个应用程序就可以工作了(尽管显然没有添加画布)因此错误是由该行或该行引起的。
所以我用try/catch环绕这条线。尽管错误是由该行引起的,但当该行被try/catch包围时,仍然会发生错误如何捕获错误?(我也使用了Throwable
尝试了这个方法,但仍然没有捕获到
麦肯瓦斯:
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
public class MCanvas extends Canvas {
protected void paint(Graphics g){
//Minesweeper.p("repaint");
Space[] data = Minesweeper.topaint;
for(int x=0; x<data.length; x++){
data[x].print();
int r = data[x].row * 10;
int c = data[x].col * 10;
int v = data[x].value;
String s = "";
//System.out.println("r:"+Integer.toString(r)+" c:"+Integer.toString(c)+" s:"+Integer.toString(v));
g.setColor(250, 0, 0);
//Minesweeper.p("if");
if(data[x].open){
switch(v){
case 0:
g.setColor(50, 50, 50);
break;
case 1:
g.setColor(100, 50, 50);
s = "1";
break;
case 2:
g.setColor(150, 50, 50);
s = "2";
break;
case 3:
g.setColor(200, 50, 50);
s = "3";
break;
case 4:
g.setColor(250, 50, 50);
s = "4";
break;
case 5:
g.setColor(250, 100, 100);
s = "5";
break;
case 6:
g.setColor(250, 125, 125);
s = "6";
break;
case 7:
g.setColor(250, 150, 150);
s = "7";
break;
case 8:
g.setColor(250, 175, 175);
s = "8";
break;
case 9:
g.setColor(250, 200, 200);
break;
default:
g.setColor(250, 100, 100);
}
} else {
g.setColor(0,0,0);
}
g.fillRect(c, r, 10, 10);
g.setColor(250, 250, 250);
Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
g.setFont(font);
g.drawString(s, c+5, r+8, Graphics.HCENTER | Graphics.BASELINE);
if(data[x].hover){
g.setColor(250, 250, 250);
g.drawLine(c, r, c, r+9);
g.drawLine(c, r, c+9, r);
g.drawLine(c+9, r, c+9, r+9);
g.drawLine(c, r+9, c+9, r+9);
}
//Minesweeper.p("here?");
}
//Minesweeper.p("here");
//Minesweeper.p(Minesweeper.error);
if(Minesweeper.error != null){
g.drawString(Minesweeper.error, 10, 10, Graphics.HCENTER | Graphics.BASELINE);
}
Minesweeper.p("msg:"+Minesweeper.message);
g.setColor(0, 0, 0);
Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE);
g.setFont(font);
g.drawString(Minesweeper.message, this.getWidth()/2, this.getHeight()-10, Graphics.HCENTER | Graphics.BASELINE);
Font fontsm = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
g.setFont(fontsm);
}
protected void keyPressed(int keyCode) {
int gameaction = getGameAction(keyCode);
int c = Minesweeper.selected.col;
int r = Minesweeper.selected.row;
switch (gameaction) {
case UP:
Minesweeper.p("UP");
if(r>0){
Minesweeper.selected.leavehere();
Minesweeper.getSpace(Minesweeper.selected.row - 1, Minesweeper.selected.col).gohere();
}
break;
case DOWN:
Minesweeper.p("DOWN");
if(r<Minesweeper.height-1){
Minesweeper.selected.leavehere();
Minesweeper.getSpace(Minesweeper.selected.row + 1, Minesweeper.selected.col).gohere();
}
break;
case LEFT:
Minesweeper.p("LEFT");
if(c>0){
Minesweeper.selected.leavehere();
Minesweeper.getSpace(Minesweeper.selected.row, Minesweeper.selected.col - 1).gohere();
}
break;
case RIGHT:
Minesweeper.p("RIGHT");
if(c<Minesweeper.length-1){
Minesweeper.selected.leavehere();
Minesweeper.getSpace(Minesweeper.selected.row, Minesweeper.selected.col + 1).gohere();
}
break;
}
repaint();
}
}
import javax.microedition.lcdui.Canvas;
导入javax.microedition.lcdui.Font;
导入javax.microedition.lcdui.Graphics;
公共类MCanvas扩展画布{
受保护的空心漆(图g){
//扫雷舰.p(“重新喷漆”);
Space[]data=扫雷舰.topaint;
对于(int x=0;x0){
扫雷舰。选定。离开此处();
getSpace(Minesweeper.selected.row-1,Minesweeper.selected.col.gohere();
}
打破
按大小写:
扫雷舰.p(“向下”);
如果(r0){
扫雷舰。选定。离开此处();
getSpace(Minesweeper.selected.row,Minesweeper.selected.col-1).gohere();
}
打破
案例权利:
扫雷舰(右);
如果(c如果我是你,我会继续在MCanvas类中插入try/catch块
任何人都很难在看不到更多代码的情况下找出发生NullPointerException的位置
从您目前粘贴的代码中,我能想到的唯一问题是:
您的扫雷舰类是否包含一个名为topaint的静态对象空间数组?您是否声明了它,但可能忘记了用数据填充它
Space[] topaint = new Space[20]; // Declared, but nothing in it yet.
试图访问扫雷舰。topaint[0]将给出NullPointerException,除非您也这样做
topaint[0] = new Space();
如中所述
…方法将立即返回setCurrent()
,而无需等待更改发生
由于上述原因,由setCurrent
触发的调用中可能出现的异常可能(而且很可能会)从您的try-catch中溜走
为了能够捕获并报告此类异常,应该研究setCurrent触发了哪些调用(在您的案例中,这些调用在API javadocs for中进行了解释),在适当的情况下覆盖这些by try catch块,并设计适当的方法在发生异常时报告异常
在您的情况下,try-catch可能会包围MCanvas.paint中的代码(这是NPE可能发生的地方),并且可以报告异常,例如,通过显示带有错误消息的适当屏幕(例如警报
)通过从catch block调用该屏幕的setCurrent
。上传MCanvas类的代码以理解better@Lucifer对于是否捕捉到错误,这肯定不会有什么区别吗?@Lucifer现在上传了全部内容。我很确定我已经用数据填充了数组,但是我如何捕捉上的NullPointerException呢display.setCurrent(canvas)
行?我不认为这是造成问题的实际行。正如Lucifer所说,我们需要更多的代码来查看。好的,我添加了MCanvas,但为什么这会影响我捕获错误的能力?