2012-05-22 6 views
6

Non capisco il comportamento di Java sugli array. Vieta di definire un array in un caso ma consente la stessa definizione in un altro.Come definire un array multidimensionale in Java usando le parentesi graffe?

L'esempio da tutorial:

String[][] names = { 
     {"Mr. ", "Mrs. ", "Ms. "}, 
     {"Smith", "Jones"} 
    }; 
System.out.println(names[0][0] + names[1][0]); // the output is "Mr. Smith"; 

Il mio esempio:

public class User { 
    private static String[][] users; 
    private static int UC = 0; 

    public void addUser (String email, String name, String pass) { 
     int i = 0; 

     // Here, when I define an array this way, it has no errors in NetBeans 
     String[][] u = { {email, name, pass}, {"[email protected]", "jack sparrow", "12345"} }; 

     // But when I try to define like this, using static variable users declared above, NetBeans throws errors 
     if (users == null) { 
     users = { { email, name, pass }, {"one", "two", "three"} }; // NetBeans even doesn't recognize arguments 'email', 'name', 'pass' here. Why? 

     // only this way works 
     users = new String[3][3]; 
     users[i][i] = email; 
     users[i][i+1] = name; 
     users[i][i+2] = pass; 
     UC = UC + 1; 
     } 
    } 

Gli errori lanciate dai NetBeans sono:

inizio illegale di espressione,

" ;" atteso,

non una dichiarazione.

E inoltre non riconosce gli argomenti email, name, pass nella definizione dell'array users. Ma li riconosce quando definisco l'array u.

Qual è la differenza tra queste due definizioni? Perché uno funziona, ma l'altro definito allo stesso modo no?

risposta

11

è necessario aggiungere new String[][] prima che l'aggregato array:

users = new String[][] { { email, name, pass }, {"one", "two", "three"} }; 
+0

Ma ho fatto questo già. Subito sotto la riga di "public class User {" è la riga "private static String [] [] users" – Green

+2

@Green La parte 'new String [] []' è implicita quando si combinano l'inizializzazione e la dichiarazione; quando si dichiara un campo o una variabile in un posto, ma si inizializza in un posto diverso, è necessario fornire esplicitamente il tipo dell'oggetto che si sta creando prima dell'aggregazione dell'array. – dasblinkenlight

2

Il primo caso è una dichiarazione di inizializzazione, mentre il secondo è solo un incarico. Questo tipo di array di riempimento è supportato solo quando si definisce un nuovo array.

5

È possibile utilizzare questa sintassi:

String[][] u = {{email, name, pass}, {"[email protected]", "jack sparrow", "12345"}}; 

Solo quando si sta dichiarando la matrice per la prima volta. Non funzionerà per l'assegnazione di valori a una variabile dopo lo che hai dichiarato altrove, ecco perché users = ... non riesce. Per l'assegnazione di valori a una già dichiarata String[][] (o una matrice di qualsiasi altro tipo è per questo), utilizzare

users = new String[][] { { email, name, pass }, {"one", "two", "three"} }; 
2

per la ri-assegnazione della matrice è necessario utilizzare new:

users = new String[][] {{email, name, pass }, {"one", "two", "three"}}; 
Problemi correlati