Erro: Exception in thread "main" java.lang.NullPointerException (projeto = Agenda)

Olá pessoal,
sou iniciante em java
tive como trabalho criar uma agenda telefonica, que conste nome, telefone, endereço, sexo, idade
para isso criei uma matriz 5X50 (50 é a capacidade de contatos)
Uso o Eclipse para criar os códigos
O código e esse ae

[code]import java.io.*;
import java.util.Scanner;
public class Agenda{

//declaração variáveis globais
static Scanner x = new Scanner(System.in);
static String M[][] = new String [50][5];
static String c;

public static void zerar(){
for(int i = 0;i<50;i++){
for(int j = 0;j<5;j++){
M[i][j] = “_”;
}}
}

public static void main(String args[])throws IOException{
int key;
String nome;
int f;

System.out.println(“Agenda”);
System.out.println(“Digite a opção desejada”);
System.out.print("1)----> Consultar agenda\n2)----> Inserir contato\n3)----> Editar contato\n4)----> Excluir contato: ");
key = x.nextInt();
switch(key){
case 1:
System.out.println(“Digite o nome a ser consultado”);
nome = x.next();
f = consulta(nome);
mostrar(f);
break;
case 2:
System.out.println(“Digite o nome a ser inserido”);
nome = x.next();
inserçao(nome);
break;
case 3:
break;
case 4:
System.out.println(“Digite o nome do contato a ser excluido”);
nome = x.next();
excluir(nome);
break;
}
}

public static int consulta(String name){
int x = 0 ;
for(int i = 0;i< 50; i++){
if(M[i][1].equals(name)){
x = i;
}else{
x = -1;
}
}
return(x);
}

public static void mostrar(int x){
System.out.println("Nome: " + M[x][1]);
System.out.println("Telefone: " + M[x][2]);
System.out.println("Endereço: " + M[x][3]);
System.out.println("Idade: " + M[x][4]);
System.out.println("Sexo: " + M[x][5]);
}

public static void inserçao(String nome)throws IOException{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String tel, end, id, sexo;
int z;
z = consulta(nome);
if(z==-1){
for(int i = 0;i< 50; i++){
if(M[i][1].equals("")){
System.out.println(“Digite o nome a ser inserido”);
nome = x.next();
M[i][1] = nome;
System.out.println(“Digite o telefone do contato”);
tel = x.next();
M[i][2] = tel;
System.out.println(“Digite o endereço do contato”);
end = x.next();
M[i][3] = end;
System.out.println(“Digite a idade do contato”);
id = x.next();
M[i][4] = id;
System.out.println(“Digite o sexo do contato”);
sexo = x.next();
M[i][5] = sexo;
}}
}
}

public static void excluir(String nome)throws IOException{
int v;
int j, f;
f = consulta(nome);

if(f==-1){
System.out.println(“Nome não consta na agenda”);
}else{
for(j = 0;j<5; j++){
System.out.println(M[f][j]);}
System.out.print(“Deseja realmente excluir este contato?(1-> excluir / outra tecla -> sair)”);
v = x.nextInt();
if(v==1){
for(j = 0; j<5; j++);
M[f][j] = “_”;
}
}
}

}[/code]

Quando eu mando rodar, aparece no console do eclipse os prompts normais. Ao escolher qualquer opção, aparece o seguinte erro:
Exception in thread “main” java.lang.NullPointerException
at Agenda.consulta(Agenda.java:51)
at Agenda.main(Agenda.java:30)

Dei uma olhada pela internet mas nao entendi sobre o que se trata esse erro.
Poderiam me ajudar?
Obrigado

Vamos por partes

Exception in thread "main" java.lang.NullPointerException at Agenda.consulta(Agenda.java:51) at Agenda.main(Agenda.java:30)

Um NullPointerException aconteceu na linha 51 do arquivo Agenda.java:

if(M[i][1].equals(name)){  

Um NullPointerException acontece quando acessamos algum atributo ou método de uma instância que não existe. Neste caso M na posição i, 1 está nulo, e você tenta acessar o método equals dele.

Solução: Instancie a variável com um objeto.

Obs: Arrays de objetos começam com todas as posições com null.

é pq nao entendo mto dessa nomenclatura java
instanciar uma variavel com um objeto
no caso a matriz M[][] seria uma variável ou o objeto?
obs; ainda nao estudei OO

[quote=FelipeR]é pq nao entendo mto dessa nomenclatura java
instanciar uma variavel com um objeto
no caso a matriz M[][] seria uma variável ou o objeto?
obs; ainda nao estudei OO [/quote]

Sem entrar em detalhes técnicos:

variáveis são lugares para guardar valores.

Em Java, estes valores podem ser tipos primitivos ou objetos.

M é o nome de um variável do tipo String[][], ou Array de Array de Strings.

A criação de um objeto, usando o operador new é o que chamamos de instanciar um objeto.

No caso desse M, ele é instanciado com new String[50][5], ou seja, criamos um objeto do tipo Array de Array de Strings, e o associamos à variável M.

Arrays são objetos que guardam outros objetos, e por enquanto todas essas posições estão vazias.

O teu método zerar é que coisa de instanciar todas essas posições desse Array de Array de String com a String “_”

Oi,

Exemplo:

public static int consulta(String name){ int x = 0 ; for(int i = 0;i< 50; i++){ if(M[i][1].equals(name)){ x = i; }else{ x = -1; } } return(x); }

Você está permitindo o operador a utilizar o método consulta sem realmente ter um nome inserido em sua agenda. Ou seja, ele não utilizou o método insert e já foi fazer uma pesquisa.

Sendo assim, a linha M[i][1].equals(name) retornara NullPointer, pois M[i][1] = nullo.

Você pode fazer.:

public static int consulta(String name){ int x = 0 ; for(int i = 0;i< 50; i++){ if(M[i][1] != null && M[i][1].equals(name)){ x = i; }else{ x = -1; // Nao encontrou resultado } } return(x); }

Tchauzin!

Oi,

Esqueci de um detalhe… seu método mostrar ocorrerá ArrayIndexOut se você não fizer.:

public static void mostrar(int x){ if (x >= 0) { System.out.println("Nome: " + M[x][1]); System.out.println("Telefone: " + M[x][2]); System.out.println("Endereço: " + M[x][3]); System.out.println("Idade: " + M[x][4]); System.out.println("Sexo: " + M[x][5]); } else { System.out.println("Nome não encontrado"); } }

Tchauzin!