2016-04-10 6 views
0

Bei der Ausführung dieses Skript:Versuch, virtuelle Methode auf null Objektverweis aufrufen (JAVA, AS)

package com.example.benjamin.labb3; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 
import java.io.IOException; 
import java.io.InputStream; 

public class Main extends Activity { 

    DrawView drawView; 

    @Override public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     drawView = new DrawView(this); 
     setContentView(drawView); 
    } 

    @Override public void onResume(){ 
     super.onResume(); 
     drawView.resume(); 
    } 

    @Override public void onPause(){ 
     super.onPause(); 
     drawView.pause(); 
    } 

    public class DrawView extends SurfaceView implements Runnable { 
     Thread gameloop = null; 
     SurfaceHolder surface; 
     volatile boolean running = false; 
     AssetManager assets = null; 
     BitmapFactory.Options options = null; 
     Bitmap incect[]; 
     int frame = 0; 

     public DrawView(Context context){ 
      super(context); 
      surface = getHolder(); 
      assets = context.getAssets(); 
      options = new BitmapFactory.Options(); 
      options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

      incect = new Bitmap[2]; 

      try { 
       for (int n = 0; n < 2; n++){ 
        String fileName = "Incect"+Integer.toString(n+1)+".png"; 
        InputStream istream = assets.open(fileName); 
        incect[n] = BitmapFactory.decodeStream(istream,null,options); 
        istream.close(); 
       } 
      } catch (IOException e){ 
       e.printStackTrace(); 
      } 
     } 

     public void resume() { 
      running = true; 
      gameloop = new Thread(this); 
      gameloop.start(); 
     } 

     public void pause() { 
      running = false; 
      boolean retry = true; 
      while (retry) { 
       try { 
        gameloop.join(); 
        retry = false; 
       } catch (InterruptedException e){} 
      } 
     } 

     @Override public void run(){ 
      while (running){ 

       if(!surface.getSurface().isValid()) 
        continue; 
       Canvas canvas = surface.lockCanvas(); 
       canvas.drawColor(Color.rgb(85,107,47)); 
       canvas.drawBitmap(incect[frame],0,0,null); 
       surface.unlockCanvasAndPost(canvas); 
       frame ++; 
       if (frame > 1){ 
        frame = 0; 
       } 
      } 
     } 
    } 
} 

Ich erhalte die Fehlermeldung:

FATAL AUSNAHME: Thread-106 Prozess : com.example.benjamin.labb3, PID: 2169 java.lang.NullPointerException: Es wurde versucht, die virtuelle Methode 'boolean android.graphics.Bitmap.isRecycled()' für eine Nullobjektreferenz bei android.graphics.Ca aufzurufen nvas.throwIfCannotDraw (Canvas.java:1269) bei android.graphics.Canvas.drawBitmap (Canvas.java:1325) bei com.example.benjamin.labb3.Main $ DrawView.run (Main.java:97) bei java.lang.Thread.run (Thread.java:818)

So Ebene i zu der Linie 97, dass der Fehler war (die in der letzten Methode aufgerufen Lauf ist()):

Linie 97: frame = 0;

Das Fehlerprotokoll sagt, dass es "null" ist, also überprüfe ich, ob Frame deklariert ist und es sich dreht aus, dass es bereits ist, also wie kann ich einen Fehler erhalten, der sagt, dass es Null ist?

erklärte ich es hier:

public class DrawView extends SurfaceView implements Runnable { 
     Thread gameloop = null; 
     SurfaceHolder surface; 
     volatile boolean running = false; 
     AssetManager assets = null; 
     BitmapFactory.Options options = null; 
     Bitmap incect[]; 
     int frame = 0; 

Oder wird das Protokoll auf etwas anderes reffering? Im Moment befolge ich ein Tutorial, wie man eine Sprite-Animation einrichtet, also verstehe ich das Protokoll noch nicht wirklich gut.

Antwort

1

incect[frame] könnte null sein. Überprüfen Sie, ob die bitmap an dieser bestimmten Position im Array existiert.

+0

Es stellte sich heraus, dass die PNG-Datei "incect" mit einem Großbuchstaben i geschrieben wurde, also änderte ich stattdessen "Increct" und es funktionierte! – Bonbin