2012-10-20 23 views
2

所以我有以下代碼:的try/catch無助於Java ME的

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(canvas);外try塊,應用程序失敗並NullPointerException。當我將該行註釋掉時,該應用程序可以正常工作(儘管顯然沒有添加畫布)。 所以這個錯誤是由那條線或者那條線引起的。

所以我用try/catch來超越那條線。儘管錯誤是由該行引起的,但當行被try/catch包圍時,錯誤仍然會發生。 我怎樣才能發現錯誤?(我試過這個使用Throwable爲好,但還是沒有抓到

MCanvas:

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(); 
    } 
} 
+0

上傳MCanvas類的代碼以及更好地理解 – Lucifer

+0

@Lucifer肯定不會有差異來判斷錯誤是否被捕獲? – ACarter

+0

@Lucifer現在上傳了整個內容。 – ACarter

回答

1

Display.setCurrent API javadocs解釋,

...的setCurrent()方法返回立即,不用等待變更發生...

由於上述原因,setCurrent觸發的呼叫中可能出現的例外情況(很可能是)會通過您的嘗試抓取。

爲了能夠捕獲和報告這些異常,我們應該研究setCurrent觸發哪些調用(在您的情況下,這些在API javadoc中爲Canvas, Event Delivery section解釋),在適當的地方通過try-catch塊進行覆蓋並設計適當的方式來報告異常情況。

在你的情況,的try-catch可能會圍繞在MCanvas.paint代碼(這是NPE可能發生)和異常可以通過顯示相應的屏幕顯示錯誤消息(如Alert)通過調用setCurrent從該屏幕報道的用於實施catch塊。

0

如果我是你,我會繼續插入try/catch塊在MCanvas類。

這是任何人都難以揣摩出你的NullPointerException異常發生沒有看到更多的代碼

唯一的問題我可以想出,從你的代碼到目前爲止粘貼是:

您的Minesweeper類是否包含一個名爲topaint的靜態對象空間數組?你有沒有聲明,但可能忘記填寫數據?

Space[] topaint = new Space[20]; // Declared, but nothing in it yet. 

嘗試訪問Minesweeper.topaint [0]會給出一個NullPointerException異常,除非你同時做

topaint[0] = new Space(); 
+0

我很確定我已經用數據填充了數組,但是如何在'display.setCurrent(canvas)'行上捕獲NullPointerException? – ACarter

+0

我不認爲這是造成麻煩的實際線路。正如Lucifer所說,我們需要更多的代碼來看待。 –

+0

好的,我已經添加了MCanvas,但是,爲什麼會影響我捕捉錯誤的能力? – ACarter