Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Array

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    7

    Array

    Nella seguente classe mi viene indicato un errore nella mancata allocazione della classe Animation:

    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import java.io.*;

    public class Sprite {

    private String ss = "Haggar.gif";
    private int Animation_id;
    private int Frame_id;
    public int dx;
    public int dy;
    private int x;
    private int y;
    private BufferedImage SpriteSheet;
    private animation[] Animation;

    public Sprite() {
    try {
    SpriteSheet = ImageIO.read(new File(ss));
    } catch (IOException e) {
    }
    x = 40;
    y = 60;
    Animation_id=1;
    Frame_id=1;
    Animation= new animation[8];
    Animation[0]=new animation();
    Animation[0].add_frame(SpriteSheet.getSubimage(0, 0, 100, 100));
    /* Sulla riga in esecuzione ho la seguente eccezione: java.lang.NullPointerException*/
    }

    ...............................
    .............................

    class animation {
    int num_frames;
    BufferedImage[] frames;
    animation( ){
    num_frames=0;
    }
    public void add_frame(BufferedImage frame){
    num_frames++;
    frames[num_frames]=frame;

    }
    }
    }

    Dove sta lo sbaglio?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    1. Usa il tag CODE per postare il codice, altrimenti non si capisce nulla
    2. Segui le convenzioni di Java per nomi di classi, attributi e metodi, semplifichi la lettura a chi legge il tuo codice. Ad esempio:

    codice:
    public class Sprite {
        private String spriteImage = "Haggar.gif"; // non e' meglio passarlo col costruttore? O tutti gli sprite avranno questa immagine?
    
        private int animationId;
        private int frameId;
    
        public int dx;
        public int dy;
    
        private int x;
        private int y;
        
        private BufferedImage spriteSheet;
        private Animation[] animations; // e' un array, andrebbe al plurale
    
        ....
    2.1 Perché dx e dy sono public?


    3. Posta lo stack trace completo dell'eccezione, è molto più utile di quel che credi.

    Detto questo, dal codice che hai postato non vedo dove istanzi SpriteSheet che quindi immagino resti a null, da qui l'errore NullPointerException. A meno che getSubImage non sia un metodo statico.

    edit: noto ora la classe animation (Animation!), lì dentro non istanzi mai frames, quando fai frames[num_frames], frames è null.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    7
    Ho revisionato il code e lo pubblico senza le parti che non sono funzionali alla riga di codice. Il problema è nella variabile SpriteSheet? Se cosi fosse avrei avuto un messaggio di errore già nel blocco Try. Come si visualizza lo Stack Trace?


    codice:
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import java.io.*;
    
    public class Sprite {
    
        private String ss = "Haggar.gif";
        private int Animation_id;
        ...................
        private BufferedImage SpriteSheet;
        private animation[] Animation;
    
        public Sprite() {
            try {
            SpriteSheet = ImageIO.read(new File(ss));
            } catch (IOException e) {
            }
          ....................................
            Animation= new animation[8];
            Animation[0]= new animation(12);
            Animation[0].set_frame(0,SpriteSheet.getSubimage(0, 0, 100, 100));
    /* Sulla riga in esecuzione ho la seguente eccezione: java.lang.NullPointerException*/
        }
    
    ........................................................
      
        class animation {
        int num_frames;
        BufferedImage[] frames;
    animation( int i){
            num_frames=i;
            frames=new BufferedImage[i];
            }
     public void set_frame(int i,BufferedImage frame){
         frames[i]=frame;
    
        }
    }
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    7
    Risolto. Non leggeva il file sicchè il puntatore era nullo.

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Acmeman
    Se cosi fosse avrei avuto un messaggio di errore già nel blocco Try. Come si visualizza lo Stack Trace?

    codice:
     
            try {
            SpriteSheet = ImageIO.read(new File(ss));
            } catch (IOException e) {
            }
    Come fa a stamparti un messaggio di errore se nel catch non c'è nulla?
    In questo caso però è inutile catturare l'eccezione, non puoi farci nulla se non rilanciarla...

    Ad ogni modo, per avere lo stack trace completo ti basta chiamare il metodo printStackTrace() di Exception, come puoi leggere nella documentazione
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.