2012-08-10 27 views
6

İşte bana bu görünümünü kullanan XML düzeni sekmesinde bir boş gösterici istisna veren özel görünüm kod:Boş işaretçi istisna

public class BoardView extends View { 

    // Drawables for the board boxes, the playable zone 
    public Drawable[][] block = new Drawable[20][10]; 
    // Drawables for the wall (yes, it's done with tiles) 
    public Drawable[] wall = new Drawable[102]; 
    // Drawable for the background, and boolean for drawing it or not 
    Drawable mbg; 
    boolean bg = false; 
    // Context and canvas to be used along the class 
    Context context; 
    Canvas c; 

    /*************************************************/ 
    /* Class constructor **************************** */ 
    /*************************************************/ 
    /* Defines the context and the canvas *********** */ 
    /*************************************************/ 
    public BoardView(Context cont, AttributeSet attrs) { 
     super(cont, attrs); 
     context = cont; 
    } 

    /*************************************************/ 
    /* Initializes drawables for playable boxes ***** */ 
    /*************************************************/ 
    /* Must be initialized one by one from the Game * */ 
    /* activity, passing all the parameters ********* */ 
    /*************************************************/ 
    public void initialize(int i, int j, int left, int top, int side) { 
     block[i][j] = context.getResources().getDrawable(R.drawable.alpha); 
     block[i][j].setBounds(left, top, left + side, top + side); 
    } 

    /*************************************************/ 
    /* Draws the board wall ************************* */ 
    /*************************************************/ 
    /* Needs the top-left point of the board frame ** */ 
    /* and the width of the wall ******************** */ 
    /*************************************************/ 
    public void createWall(int left, int top, int side) { 
     int i = 0, x, y; 
     x = left - side/2; 
     y = top; 
     // The left wall 
     while (i < 40) { 
      wall[i] = context.getResources().getDrawable(R.drawable.brick); 
      wall[i].setBounds(x, y, x + side/2, y + side/2); 
      y = y + side/2; 
      i = i + 1; 
     } 
     x = left + side * 10; 
     y = top; 
     // The right wall 
     while (i < 80) { 
      wall[i] = context.getResources().getDrawable(R.drawable.brick); 
      wall[i].setBounds(x, y, x + side/2, y + side/2); 
      y = y + side/2; 
      i = i + 1; 
     } 
     x = left - side/2; 
     // The floor 
     while (i < 102) { 
      wall[i] = context.getResources().getDrawable(R.drawable.brick); 
      wall[i].setBounds(x, y, x + side/2, y + side/2); 
      x = x + side/2; 
      i = i + 1; 
     } 
    } 

    /*************************************************/ 
    /* Draws the board background ******************* */ 
    /*************************************************/ 
    /* Needs the top-left point of the board frame ** */ 
    /* and the width of the wall ******************** */ 
    /*************************************************/ 
    public void createBg(int left, int top, int side) { 
     // Set board background (if any) 
     bg = false; 
     int bgn = 1 + (int) (Math.random() * 19); 
     switch (bgn) { 
     case 1: 
      mbg = getResources().getDrawable(R.drawable.bg1); 
      break; 
     case 2: 
      mbg = getResources().getDrawable(R.drawable.bg2); 
      break; 
     case 3: 
      mbg = getResources().getDrawable(R.drawable.bg3); 
      break; 
     case 4: 
      mbg = getResources().getDrawable(R.drawable.bg4); 
      break; 
     case 5: 
      mbg = getResources().getDrawable(R.drawable.bg5); 
      break; 
     case 6: 
      mbg = getResources().getDrawable(R.drawable.bg6); 
      break; 
     case 7: 
      mbg = getResources().getDrawable(R.drawable.bg7); 
      break; 
     case 8: 
      mbg = getResources().getDrawable(R.drawable.bg8); 
      break; 
     case 9: 
      mbg = getResources().getDrawable(R.drawable.bg9); 
      break; 
     case 10: 
      mbg = getResources().getDrawable(R.drawable.bg11); 
      break; 
     case 11: 
      mbg = getResources().getDrawable(R.drawable.bg11); 
      break; 
     case 12: 
      mbg = getResources().getDrawable(R.drawable.bg12); 
      break; 
     case 13: 
      mbg = getResources().getDrawable(R.drawable.bg13); 
      break; 
     case 14: 
      mbg = getResources().getDrawable(R.drawable.bg14); 
      break; 
     case 15: 
      mbg = getResources().getDrawable(R.drawable.bg15); 
      break; 
     case 16: 
      mbg = getResources().getDrawable(R.drawable.bg16); 
      break; 
     case 17: 
      mbg = getResources().getDrawable(R.drawable.bg17); 
      break; 
     case 18: 
      mbg = getResources().getDrawable(R.drawable.bg18); 
      break; 
     case 19: 
      mbg = getResources().getDrawable(R.drawable.bg19); 
      break; 
     } 
     mbg.setBounds((int) (left), (int) (top), (int) (left + side * 10), 
       (int) (top + 20 * side)); 
    } 

    /*************************************************/ 
    /* Draws the board ****************************** */ 
    /*************************************************/ 
    /* Draws the walls, the bg and all the boxes **** */ 
    /*************************************************/ 
    @Override 
    protected void onDraw(Canvas canvas) { 
     c = canvas; 
     super.onDraw(canvas); 
     if (bg) 
      mbg.draw(canvas); 
     for (int i = 0; i < 102; i++) 
      wall[i].draw(c); 
     for (int i = 0; i < 20; i++) 
      for (int j = 0; j < 10; j++) { 
       block[i][j].draw(canvas); 
      } 
     // Actually draw 
     invalidate(); 
    } 

    /*************************************************/ 
    /* Canvas getter ******************************** */ 
    /*************************************************/ 
    public Canvas getCanvas() { 
     return c; 
    } 

    /*************************************************/ 
    /* Colors a box ********************************* */ 
    /*************************************************/ 
    /* Changes the drawable for the indicated box to */ 
    /* to 'c'. Can also be COLOR_NONE to undraw ***** */ 
    /*************************************************/ 
    public void setColor(int i, int j, byte c) { 
     Rect rect; 
     rect = block[i][j].getBounds(); 
     switch (c) { 
     case Values.COLOR_NONE: 
      block[i][j] = context.getResources().getDrawable(R.drawable.alpha); 
      ; 
      break; 
     case Values.COLOR_RED: 
      block[i][j] = context.getResources().getDrawable(
        R.drawable.block_red); 
      break; 
     case Values.COLOR_GREEN: 
      block[i][j] = context.getResources().getDrawable(
        R.drawable.block_green); 
      break; 
     case Values.COLOR_BLUE: 
      block[i][j] = context.getResources().getDrawable(
        R.drawable.block_blue); 
      break; 
     case Values.COLOR_YELLOW: 
      block[i][j] = context.getResources().getDrawable(
        R.drawable.block_yellow); 
      break; 
     case Values.COLOR_PINK: 
      block[i][j] = context.getResources().getDrawable(
        R.drawable.block_pink); 
      break; 
     case Values.COLOR_PURPLE: 
      block[i][j] = context.getResources().getDrawable(
        R.drawable.block_purple); 
      break; 
     case Values.COLOR_WHITE: 
      block[i][j] = context.getResources().getDrawable(
        R.drawable.block_white); 
      break; 
     } 
     block[i][j].setBounds(rect); 
    } 
} 

ve burada hata günlüğü var:

wall[i].draw(c); 

nasıl düzeltebilirim: Burada

java.lang.NullPointerException 
    at com.seavenois.tetris.BoardView.onDraw(BoardView.java:166) 
    at android.view.View.draw(View.java:6880) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
    at android.view.View.draw(View.java:6883) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
    at android.view.View.draw(View.java:6883) 
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:466) 
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:320) 
    at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:325) 
    at com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:372) 
    at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1640) 
    at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1391) 
    at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:1165) 
    at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.partActivated(LayoutEditorDelegate.java:734) 
    at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate.partBroughtToTop(LayoutEditorDelegate.java:744) 
    at org.eclipse.ui.internal.PartListenerList$2.run(PartListenerList.java:87) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:888) 
    at org.eclipse.ui.internal.PartListenerList.fireEvent(PartListenerList.java:57) 
    at org.eclipse.ui.internal.PartListenerList.firePartBroughtToTop(PartListenerList.java:85) 
    at org.eclipse.ui.internal.PartService.firePartBroughtToTop(PartService.java:208) 
    at org.eclipse.ui.internal.WorkbenchPagePartList.firePartBroughtToTop(WorkbenchPagePartList.java:76) 
    at org.eclipse.ui.internal.WorkbenchPagePartList.fireActiveEditorChanged(WorkbenchPagePartList.java:52) 
    at org.eclipse.ui.internal.PartList.setActiveEditor(PartList.java:162) 
    at org.eclipse.ui.internal.WorkbenchPage.makeActiveEditor(WorkbenchPage.java:1355) 
    at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3629) 
    at org.eclipse.ui.internal.WorkbenchPage.requestActivation(WorkbenchPage.java:3159) 
    at org.eclipse.ui.internal.PartPane.requestActivation(PartPane.java:279) 
    at org.eclipse.ui.internal.EditorPane.requestActivation(EditorPane.java:98) 
    at org.eclipse.ui.internal.PartPane.setFocus(PartPane.java:325) 
    at org.eclipse.ui.internal.EditorPane.setFocus(EditorPane.java:127) 
    at org.eclipse.ui.internal.PartStack.presentationSelectionChanged(PartStack.java:837) 
    at org.eclipse.ui.internal.PartStack.access$1(PartStack.java:823) 
    at org.eclipse.ui.internal.PartStack$1.selectPart(PartStack.java:137) 
    at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:133) 
    at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:269) 
    at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:278) 
    at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1) 
    at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$2.handleEvent(DefaultTabFolder.java:88) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 
    at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774) 
    at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2746) 
    at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1433) 
    at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) 
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701) 
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665) 
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) 
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1410) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1386) 

hat BoardView.java 166 mı? Bir tetris kaynak kodundan bu kodu var ve ben ileride başvurmak üzere bu eğitimi almak isteyen ama

+6

Yani yığın izleme Eğer 'BoardView.onDraw' yönteminin içine olan hat 166 bir' NullPointerException' alıyorsanız olduğunu söyler. Bu satırı kendi başınıza gönderebilir misiniz? – Craigy

+1

@Jan Smith hadi,) [i] .draw (c) = o satır için – Korcholis

+0

duvarı bekliyoruz; – Jan

cevap

5

Şu anda onDraw() kontrol herhangi NULL yapmıyorlar. Eğer daha kararlı kod yapmak ve daha hızlı sorununuzu bulmasına yardımcı yardımcı olacaktır içinde

NULL çekleri olmak.

aşağıda gibi bazı NULL çekleri eklersiniz:

protected void onDraw(Canvas canvas) { 
    if (canvas != null) { 
     c = canvas; 
     super.onDraw(canvas); 
     if (bg) { 
      if (mbg != null) { 
       mbg.draw(canvas); 
      } else { 
       /* 
       * Handle null value 
       * print to logcat this was null 
       */ 
      } 
     } 
     for (int i = 0; i < 102; i++) { 
      if (wall[i] != null) { 
       wall[i].draw(c); 
      } else { 
       /* 
       * Handle null value 
       * print to logcat this was null 
       */ 
      } 
     } 
     for (int i = 0; i < 20; i++) { 
      for (int j = 0; j < 10; j++) { 
       if (block[i][j] != null) { 
        block[i][j].draw(canvas); 
       } else { 
        /* 
        * Handle null value 
        * print to logcat this was null 
        */ 
       } 
      } 
     } 
     //Actually draw 
     invalidate(); 
    } else { 
     /* 
     * Handle null value 
     * print to logcat this was null 
     */ 
    } 

} 
+0

olan 'in' Drawable's herhangi çok teşekkür olmadığını kontrol etmesi gerekir. şimdi ben ilerleme yapabilirim: D – Jan

+0

nasıl olur +1? D: üzgünüm burada yeni – Jan

+0

Bu cevabın en üste yanında yukarı ve aşağı yön gösteren bazı oklar ve bir onay işareti vardır. Onay işaretini kontrol edin ve sonra yukarı okunu + 1'e tıklayın. =) SO'ya hoş geldiniz. – prolink007

0

Ben başlatma yöntemleri fiili çağrı görmüyorum oyunun düzenini görüntüleyemezsiniz.

Mesela:

initialize(i, j, left, top, side); 

Yani sanırım bir duvar, blok veya mbg ya hala boş olacak şekilde ve dışarıdan bir şey üzerine atlamak bunu.

Belki kullanımıyla ilgili bazı kodu eklemek ve eğer ipucu isnt yeterince görünümünüzü initialise.

(Veya ama şu umarım değil durumda, yanılıyor muyum!)

İlgili konular