Autore Topic: instantiationException  (Letto 829 volte)

Offline Miccia

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    emulatore xD
instantiationException
« il: 27 Novembre 2012, 20:12:35 CET »
0
Ciao!
Seguivo un corso di programmazione di giochi su android (sul blog di against the grain, per chi non lo conoscesse : http://obviam.net/, ha un sacco di articoli interessanti!), quando mi sono imbattuto in questo errore:
Codice: [Seleziona]
11-27 18:38:35.093: E/AndroidRuntime(722): FATAL EXCEPTION: main
11-27 18:38:35.093: E/AndroidRuntime(722): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.gametest1/com.example.gametest1.MainGamePanel}: java.lang.InstantiationException: can't instantiate class com.example.gametest1.MainGamePanel; no empty constructor

la classe a cui fà riferimento Logcat è la seguente
Codice (Java): [Seleziona]
import android.util.*;
import android.content.Context;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public  class MainGamePanel extends SurfaceView implements SurfaceHolder.Callback{

        private MainThread mt;
       
        //private static final String TAG = MainGamePanel.class.getSimpleName();
               
       
        public MainGamePanel(Context context){ //Costruttore della classe MainActivity 
                super(context);                                  //costruttore della super classe
                // adding the callback (this) to the surface holder to intercept events
                //This line sets the current class as the handler for the events happening on the actual surface.
                getHolder().addCallback(this);
                //Making the main panel focusable so it can handle events
                setFocusable(true);            
               
                mt = new MainThread(getHolder(),this);                  //Creo un nuovo oggetto della classe thread
       
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                        int height) {
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
                mt.setRunning(true);
                mt.start();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                        while(retry){
                                 try{
                                mt.join();
                                retry=false;
                                 }
                                 catch(InterruptedException e){
                                 //Retry closing the thread
                                 }
                        }
        }
        @Override
        public boolean onTouchEvent(MotionEvent event){
                if(event.getX() == MotionEvent.ACTION_DOWN){
                       
                        //Se viene toccata la parte inferiore dello schermo l'attività viene terminata
                        if(event.getX() > getHeight() - 50){mt.setRunning(false);
                        //((Activity)getContext()).finish();
                        }else{ //loggo le coordinate del tocco
                                Log.d("MainGamePanel","x coord : "+event.getX()+" y coord : "+event.getY());
                        }      
                }
                        return super.onTouchEvent(event);
        }

        @Override
        protected void onDraw(Canvas canvas){  
        }



}

chevordì? Magari è una caxxata però sto parecchio arruginito quindi non riesco a venirne fuori!

Grazie in anticipo =)

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:instantiationException
« Risposta #1 il: 27 Novembre 2012, 22:20:20 CET »
0
Codice: [Seleziona]
can't instantiate class com.example.gametest1.MainGamePanel; no empty constructorQuando si dice "self-explanatory".
Non puoi istanziare quella classe facendo new MainGamePanel() perchè quella classe non prevede un costruttore vuoto
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Miccia

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    emulatore xD
Re:instantiationException
« Risposta #2 il: 27 Novembre 2012, 23:38:41 CET »
0
Ho controllato anche io, ma non chiamo mai un costruttore vuoto di MainGamePanel
le altri classi sono queste:

Codice (Java): [Seleziona]
package com.example.gametest1;

import android.view.*;
import android.util.Log;

public class MainThread extends Thread{

        private boolean running;
        private SurfaceHolder surfaceHolder;
        private MainGamePanel gamePanel;
        private static final String TAG = MainThread.class.getSimpleName();
       
       
       
        public MainThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel){
                super();
                this.surfaceHolder = surfaceHolder;
                this.gamePanel = gamePanel;
               
                /* We declared the gamePanel and surfaceHolder variables and a constructor taking the instances as parameters.
                 * It is important to have them both and not just the gamePanel as we need to lock the surface when we draw and
                 * that can be done through the surfaceHolder only.
            **/

               
        }
        public void setRunning(boolean running){this.running=running;}
        @Override
        public void run(){
                long tickCount = 0L;
                Log.d(TAG,"Application launched");
                while(running){                
                        tickCount ++;
                                //Update game state
                                //Render state to the screen
                        }
                Log.d(TAG,"Loop executed"+tickCount+" times");
       
        }
}

e :

Codice (Java): [Seleziona]
package com.example.gametest1;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;



public class GameActivity extends Activity{
        //called when the activity is started//
       
        private static final String TAG = GameActivity.class.getSimpleName();
       
        @Override
       
        public void onCreate(Bundle savedInstanceState){
               
                super.onCreate(savedInstanceState);            
                //Requesting to turn the title off
                        requestWindowFeature(Window.FEATURE_NO_TITLE);
                //Making it full screen
                        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
                //Set our MainGamePanel on this view
                        setContentView(new MainGamePanel(this));
                //Logging...
                        Log.d(TAG,"[+] view added");                   
        }
        @Override
        public void onDestroy(){
                Log.d(TAG,"[-] Destroyed...");
                super.onDestroy();
        }
        @Override
        public void onStop(){
                Log.d(TAG,"[-] Stopped...");
                super.onStop();
        }

}

e in nessuna delle due uso un costruttore vuoto di MainGamePanel  o_O
quindi ho pensato di creargli il costruttore vuoto per farlo contento solo che
Codice (Java): [Seleziona]
                public MainGamePanel(){

                        super();                       
                }
mi dà "The constructor SurfaceView() is undefined"
ho cercato nelle API e ho trovato i costruttori di SurfaceView
Codice (Java): [Seleziona]
         SurfaceView(Context context)
SurfaceView(Context context, AttributeSet attrs)
SurfaceView(Context context, AttributeSet attrs, int defStyle)

da dove lo piglio sto context?Ho provato (nella disperazione) a passargli null ma ovviamente non è andata, NullPointerException xD

[edit] che devo fà implementare un costruttore vuoto di SurfaceView? pure se faccio
Codice (Java): [Seleziona]
        private MainThread mt;
        public static Context a;
       
        //private static final String TAG = MainGamePanel.class.getSimpleName();
                public MainGamePanel(){
               
                        super(a=new Context());
               
                       
                }
mi dice che non posso instanziare il tipo Context
T_T
« Ultima modifica: 28 Novembre 2012, 00:02:13 CET da Miccia »

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:instantiationException
« Risposta #3 il: 28 Novembre 2012, 00:15:52 CET »
0
come context prova a passargli il getApplicationContext() dall'activity
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Miccia

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    emulatore xD
Re:instantiationException
« Risposta #4 il: 28 Novembre 2012, 00:22:52 CET »
0
Come?
Se scrivo brutalmente
Codice: [Seleziona]
super(getApplicationContext())dice che è indefinito per la classe MainGamePanel, perché non estendo activity
ho provato anche con getContext() ma mi dà "cannot refer to an instance method while explicitly invoking a constructor"
« Ultima modifica: 28 Novembre 2012, 00:34:30 CET da Miccia »

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:instantiationException
« Risposta #5 il: 28 Novembre 2012, 08:47:04 CET »
0
Come?
Se scrivo brutalmente
Codice: [Seleziona]
super(getApplicationContext())dice che è indefinito per la classe MainGamePanel, perché non estendo activity
ho provato anche con getContext() ma mi dà "cannot refer to an instance method while explicitly invoking a constructor"
no, quando fai la new maingamepanel!
il context devono passartelo quando crei un'istanza
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia