Visualizzazione dei risultati da 1 a 10 su 10

Discussione: array, dubbio

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    array, dubbio

    Ciao a tutti, volevo chiedervi, qual'è la differenza?
    codice:
    class D{
      private int [] c = new int[2];
      D(){
        c[0] = 4;
        c[1] = 3;
      }
    }
    codice:
    class D{
      private int [] c;
      D(){
        c[0] = 4;
        c[1] = 3;
      }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    in questo caso hai

    codice:
    class D{
      private int [] c = new int[2];
      D(){
        c[0] = 4;
        c[1] = 3;
      }
    }
    che al momento della dichiarazione del vettore,

    codice:
      private int [] c = new int[2];
    c'è anche l'istanziazione dello stesso (dichiari cioè quanto spazio occupa).
    Con il costruttore poi vai a dire chi sono i suoi elementi.

    mentre qui fai


    codice:
    class D{
      private int [] c;
      D(){
        c[0] = 4;
        c[1] = 3;
      }
    }
    quando dichiari il vettore dici solo che vuoi un vettore di interi, è nel costruttore che dici quanto vale il vettore (considerala un'istanziazione implicita, in cui la dimensione è dettata dal numero di elementi che metti tra le graffe)

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ...ci sono i vettori per questo scopo, la seconda forma secondo me è sbagliata, perchè non segnala errori il compilatore?

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Lucked
    perchè non segnala errori il compilatore?
    Perché dovrebbe? Il vettore viene inizializzato a null (cosa perfettamente valida), sta al programmatore fare in modo che quel vettore non sia null nel momento in cui viene usato. In questo caso si vede ad occhio che manca qualcosa ma in generale un vettore può essere lasciato a null e istanziato successivamente per cui non c'è nulla di sbagliato in quella scrittura
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Alex'87
    Perché dovrebbe? Il vettore viene inizializzato a null (cosa perfettamente valida), sta al programmatore fare in modo che quel vettore non sia null nel momento in cui viene usato. In questo caso si vede ad occhio che manca qualcosa ma in generale un vettore può essere lasciato a null e istanziato successivamente per cui non c'è nulla di sbagliato in quella scrittura
    anzi ci sono pure casi che il vettore lo inizializzi tramite metodi.
    L'operazione è corretta perché tu dichiari di voler utilizzare un'istanza di quel tipo, solo quando vorrai inserirci dei valori, devi dichiararne la dimensione.
    Anche nel caso in cui inizializzi tramite metodo, hai cmq un punto in cui fai o una new o un'istanziazione esplicita, per cui in fase di compilazione non hai errori (se lo usi male li hai in esecuzione)

  6. #6
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Il primo caso è come l'ha descritto valia: l'inizializzazione avviene esplicitamente prima ancora dell'esecuzione del costruttore. All'ingresso di quest'ultimo ti trovi un array "valido" in cui tutti gli elementi sono inizializzati al valore di default (0 per gli array di int) e a cui puoi tranquillamente accedere in lettura e, come fai tu, in scrittura.
    Attenzione per quanto riguarda il secondo caso: la spiegazione di valia è corretta, solo che si riferisce a un codice diverso, ossia

    codice:
    class D{
      private int [] c;
      D(){
        c = new int[] {4, 3};
      }
    }
    in cui l'inizializzazione di "c" avviene all'interno del costruttore. Quello che stai facendo in questo modo è istanziare un nuovo array di int, contemporaneamente specificando che deve contenere - in sequenza - gli elementi 4 e 3: è evidente - e dunque implicito - che l'array avrà lunghezza 2.

    In merito al secondo caso che hai posto vale quanto detto da Alex'87, ma vorrei fare una precisazione.
    A differenza delle variabili locali (per le quali se non esegui una inizializzazione esplicita il compilatore segnala il classico messaggio "variable XXX might not have been initialized"), nel caso delle variabili di istanza (gli attributi) è il sistema stesso ad attuare una inizializzazione implicita, applicando la valorizzazione con un valore di default (0 se la variabile è int, null se è un array o un oggetto, ecc.).
    Per questo non ricevi errori: il compilatore riconosce che "c" è un attributo, si accorge che non hai fatto tu l'inizializzazione e predispone quindi il codice in modo che quest'ultima venga eseguita con il default "null".
    Poi, è evidente che se cerchi di accedere ad un valore di un array null incorrerai in una eccezione... ma questo è un errore che verrà riconosciuto solo a runtime.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    L'operazione è corretta perché tu dichiari di voler utilizzare un'istanza di quel tipo, solo quando vorrai inserirci dei valori, devi dichiararne la dimensione.
    pero poi accedo a delle posizioni nella memoria quindi, come succede anche per il C, delle posizioni a cui non è consentito accedere?

    quando faccio:

    c[0] = 4;
    c[1] = 3;

    scrivo qualcosa nella memoria credo.

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Ah un momento, ieri sera compilavo ed eseguivo un programma cosi:

    codice:
    class D{
      private int [] c;
      D(){
        c[0] = 4;
        c[1] = 3;
      }
    }
    
    class p{
    public static void main(String [] args){
      new D();
    }
    }
    e a runtime non mi segnalava nessun errore, per questo ho aperto il post! Invece stamattina me lo segnala... magari, provo a dire...che puo nascere qualche problema se compili D ed esegui p...anche se stamattina non succede, boh ci faro attenzione

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    L'ordine di compilazione è importante:

    prima compili D e poi compila P (magari dai dei nomi che non siano lettere dell'alfabeto e basta), ma se compili direttamente la classe che compila il main, il compilatore in automatico compila tutte le classi da lui riferite.

    Guarda bene agli errori in runtime e agli errori di compilazione, si presentano in istanti diversi e hanno significati diversi

    questa classe funziona senza errori di compilazione/esecuzione

    codice:
    public class Main {
    
        private static int[] vector ;
    
        public Main(){
            vector = new int[2];
            vector[0] = 1;
            vector[1] = 2;
        }
    
        public static void main(String [] argv){
            Main main = new Main();
            for (Integer intero : vector) System.out.println("intero : " + intero);
        }
    }

  10. #10
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    pero poi accedo a delle posizioni nella memoria quindi, come succede anche per il C, delle posizioni a cui non è consentito accedere? quando faccio: c[0] = 4; c[1] = 3; scrivo qualcosa nella memoria credo.
    Certo che stai accedendo a delle "posizioni" in memoria. Parlando in generale (quindi, non solo nel caso che hai sollevato) se sono valide, il dato verrà inserito correttamente. Se non lo sono, riceverai un errore dalla macchina virtuale (NullPointerException se l'array è null, ArrayIndexOutOfBoundsException se fai riferimento ad un indice fuori da quelli ammessi).
    In entrambi i casi, si tratta di una situazione che sarà verificata a runtime: il compilatore non può sapere se, al momento in cui verranno eseguite, quelle istruzioni faranno riferimento a una posizione "esistente" oppure no. Dipende dalla sequenza di esecuzione.

    e a runtime non mi segnalava nessun errore
    Molto probabilmente stavi eseguendo qualcos'altro, oppure hai fatto un po' di prove e hai perso di vista quale codice stavi effettivamente eseguendo (una possibilità può anche essere quella prospettata da valia).
    Guarda: cancella tutti i class, ricompila il codice che hai postato con javac *.java e riesegui. Vedrai che incorrerai in una eccezione.

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.