2012-08-10 11 views
6

Aquí está el código de la vista a medida que me da una excepción de puntero nulo en la ficha de presentación del XML que utiliza este punto de vista:excepción de puntero nulo con vista personalizada en xml diseño

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); 
    } 
} 

y aquí está el registro de errores:

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) 

Aquí es la línea 166 de BoardView.java:

wall[i].draw(c); 

¿Cómo puedo solucionar este problema? Obtuve este código de un código fuente de tetris y deseo estudiarlo para futuras referencias, pero no puedo ver el diseño del juego

+6

lo tanto, el seguimiento de la pila te dice que vas a encontrar un 'NullPointerException' en la línea 166, que está dentro del método' BoardView.onDraw'. ¿Podrías publicar esa línea por sí mismo? – Craigy

+1

vamos @Jan Smith, estamos esperando esa línea =) – Korcholis

+0

muro [i] .draw (c); – Jan

Respuesta

5

En este momento, no haciendo ninguna NULL comprobar en su onDraw().

Tener los registros de NULL te ayudará a crear un código más estable y te ayudará a encontrar tu problema más rápido.

me gustaría añadir en algunos NULL cheques, como a continuación:

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

funcionó muchísimas gracias. ahora puedo progresar: D – Jan

+0

¿cómo haces +1? D: lo siento im new here – Jan

+0

Al lado de la parte superior de esta respuesta hay algunas flechas que apuntan hacia arriba y hacia abajo y una marca de verificación. Marque la marca de verificación y luego haga clic en la flecha hacia arriba a +1. =) Bienvenido a SO. – prolink007

0

No veo la llamada real de los métodos de inicialización.

Tales como:

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

así que supongo que hacerlo desde el exterior y se pierda en algo para que sea una pared, bloque o la MBG siguen siendo nula.

Quizás agregue un código de cómo se usa e inicie su vista si esa sugerencia no es suficiente.

(O bien, pero eso es de esperar que no es el caso, estoy equivocado!)

Cuestiones relacionadas