2012-05-22 28 views
6

No entiendo el comportamiento de Java sobre las matrices. Se prohíbe definir una matriz en un caso, pero permite la misma definición en otro.¿Cómo se define una matriz multidimensional en Java con llaves?

El ejemplo del tutorial:

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

Mi ejemplo:

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; 
     } 
    } 

Los errores arrojados por NetBeans son:

inicio ilegal de expresión,

" ; " esperado,

no es una declaración.

Y también que no reconoce argumentos email, name, pass en la definición de la matriz users. Pero los reconoce cuando defino u matriz.

¿Cuál es la diferencia entre estas dos definiciones? ¿Por qué funciona pero el otro definido de la misma manera no?

Respuesta

11

es necesario agregar new String[][] antes de que el agregado de matriz:

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

Pero tengo hecho esto ya Justo debajo de la línea de "Usuario de clase pública {" está la línea "private static String [] [] users" – Green

+2

@Green La 'nueva cadena String [] []' está implícita cuando se combinan la inicialización y la declaración; cuando declara un campo o una variable en un lugar, pero lo inicializa en un lugar diferente, debe proporcionar explícitamente el tipo del objeto que está creando antes del agregado de la matriz. – dasblinkenlight

2

El primer caso es un estado de inicialización, mientras que el segundo sólo es una asignación. Ese tipo de matrices de llenado solo se admite al definir una nueva matriz.

5

Puede utilizar esta sintaxis:

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

Sólo cuando se está declarando la matriz por primera vez. No funcionará para asignar valores a una variable String[][]después de que haya declarado en otro lugar, es por eso que users = ... falla. Para la asignación de valores a la ya declarada String[][] (o una matriz de cualquier otro tipo para el caso), utilice

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

para volver a asignar la matriz debe utilizar new:

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