Erro de NullPointerException

Oi pessoal, estou fazendo um jogo de batalha naval. A organização do meu código está mais ou menos a seguinte: Classe Principal, Classe Navios, Classe Menu, Classe Mapa.
A Classe Navios fornece alguns métodos para criação de navios(foi determinado 4 tipos: tamanho 2,3,4 e 5, aleatório, e manualmente)
Classe menu é a interação com o usuário(recebe os parâmetros e etc. )
E a classe mapa por enquanto cria ele e altera como for requisitado(por exemplo adicionando um navio)

Acontece que um erro maldito ocorre e eu nao consegui interpreta-lo

Exception in thread “main” java.lang.NullPointerException
at Pacote.Navios.criarNavioDois(Navios.java:76)
at Pacote.Menu.Opcoes(Menu.java:91)
at Pacote.Principal.main(Principal.java:14)

Aí estão as respectivas linhas:

[code]public void criarNavioManualmente(int direcao, int tamanho, int x, int y) {…}

public void criarNavioAleatoriamente() {...}

// e os demais métodos seguem o mesmo padrão…
// Mas em todos eles acontece o mesmo tipo de erro, na linha Equivalente
//A seguir o método aonde acontece o erro:

public void criarNavioDois(int direcao2, int x, int y) {

    switch (direcao2) {
        case 1:

            for (int a = 0; a < 2; a++) {

linha 76 mapNavios.mapa[x][y] = 1;
y++;
}

            break;
        case 2:

            for (int a = 0; a < 2; a++) {
                mapNavios.mapa[x][y] = 1;
                x++;

            }
            break;
    }[/code]

Agora, o trecho do código em Menu.java citado pelo erro

[code]case 3:

                        int x2 = Integer.parseInt(JOptionPane.showInputDialog("Digite a linha"));
                        int y2 = Integer.parseInt(JOptionPane.showInputDialog("Digite a Coluna"));
                        int direcao2 = Integer.parseInt(JOptionPane.showInputDialog("1- Horizontal\n"
                                + "2- Vertical \n"));


                        navios.criarNavioDois(direcao2, x2, y2);

                        break;[/code]

alguém pode me ajudar?

java.lang.NullPointerException.
Este erro indica que você esta apontando para um objeto que não existe, ou o caminho esta incorreto.

Tenta assim

navios navios = new navios();

navios.criarNavioDois(direcao2, x2, y2);

Bom eu precisaria do código completo para poder testar.

Mas vai uma dica para somar à solução do amigo acima.

Já tentou debugar para ver se os valores estão chegando nos
lugares corretos?

Abraço.

[quote=joaoabi]java.lang.NullPointerException.
Este erro indica que você esta apontando para um objeto que não existe, ou o caminho esta incorreto.

Tenta assim

[code]
navios navios = new navios();

navios.criarNavioDois(direcao2, x2, y2);
[/code][/quote]

Oi joão, obrigado pela atenção. eu já fiz isso. Não postei o código completo. Mas está logo depois da criacao classe:

[code]public class Menu {

int i, j;
boolean vf = false;
boolean vf3 = false;
int numeroDeLinhas;
Mapa map = new Mapa();
Navios navios = new Navios();

[/code]

Olha no seu código o seguinte, quando você passa o int x e int y.
Qual o valor que o int x, inty estão recebendo?
Verifica isso!
Caso esteja retornando o valor certo posta o código completo ai.

[code]public void criarNavioDois(int direcao2, int x, int y) {

    switch (direcao2) {  
        case 1:  

            for (int a = 0; a < 2; a++) {  

linha 76 mapNavios.mapa[x][y] = 1;
y++;
}

            break;  
        case 2:  

            for (int a = 0; a < 2; a++) {  
                mapNavios.mapa[x][y] = 1;  
                x++;  

            }  
            break;  
    }  [/code]
public void criarNavioDois(int direcao2, int x, int y) {  

Aqui qual o Valor que esta chegando para x e y?

Abraço.

Por favor, ao postar tópicos dê um título descritivo. Não adianta dizer “erro miserável” ou que você perdeu horas, pois isso não descreve “que” erro miserável é esse.

Onde você criou a variável mapNavios?

São os números que estou recebendo mesmo.

[code]package Pacote;

import javax.swing.JOptionPane;

public class Menu {

int i, j;
boolean vf = false;
boolean vf3 = false;
int numeroDeLinhas;
Mapa map = new Mapa();
Navios navios = new Navios();


public void Opcoes() {




    int escolha;

    escolha = Integer.parseInt(JOptionPane.showInputDialog("1- Criar mapa\n"
            + "2- Exibir mapa \n"
            + "3- Criar navio\n"
            + "0- Sair\n"));

    switch (escolha) {
        case 1:
            int size = Integer.parseInt(JOptionPane.showInputDialog("Digite o tamanho do mapa"));
            map.criarMapa(size);


            break;

        case 2:

           
            JOptionPane.showMessageDialog(null, map.apresentarMapa());
            break;







        case 3:
            
            do {
                int menu3_1 = Integer.parseInt(JOptionPane.showInputDialog("1- Criar navio manualmente\n"
                        + "2- Criar navio aleatoriamente \n"
                        + "3- Criar navio tamanho 2\n"
                        + "4- Criar navio tamanho 3\n"
                        + "5- Criar navio tamanho 4\n"
                        + "6- Criar navio tamanho 5\n"
                        + "0- chega de criar navios\n"));

                switch (menu3_1) {// aqui é um sub menu do menu principal, aonde eu crio os navios da maneira como desejada
                    case 1:
                        JOptionPane.showMessageDialog(null, "obs: o navio será posicionado"
                                + " a partir da ponta da posição digitada");
                        int x = Integer.parseInt(JOptionPane.showInputDialog("Digite a linha"));
                        int y = Integer.parseInt(JOptionPane.showInputDialog("Digite a Coluna"));

                        int tamanho = Integer.parseInt(JOptionPane.showInputDialog("Agora, digite "
                                + "o tamanho do navio")); // depois devo limitar o tamanho entre 2 e 5
                        int direcao1 = Integer.parseInt(JOptionPane.showInputDialog("1- Horizontal\n"
                                + "2- Vertical \n"));

                        navios.criarNavioManualmente(direcao1, tamanho, x, y);
                        break;

                    case 2:
                        navios.criarNavioAleatoriamente();

                        break;
                    case 3:

                        int x2 = Integer.parseInt(JOptionPane.showInputDialog("Digite a linha"));
                        int y2 = Integer.parseInt(JOptionPane.showInputDialog("Digite a Coluna"));
                        int direcao2 = Integer.parseInt(JOptionPane.showInputDialog("1- Horizontal\n"
                                + "2- Vertical \n"));

                  
                        navios.criarNavioDois(direcao2, x2, y2);
                        

                        break;
                    case 4:
                        int x3 = Integer.parseInt(JOptionPane.showInputDialog("Digite a linha"));
                        int y3 = Integer.parseInt(JOptionPane.showInputDialog("Digite a Coluna"));

                        int direcao3 = Integer.parseInt(JOptionPane.showInputDialog("1- Horizontal\n"
                                + "2- Vertical \n"));

                        navios.criarNavioTres(direcao3, x3, y3);
                        break;

                    case 5:
                        int x4 = Integer.parseInt(JOptionPane.showInputDialog("Digite a linha"));
                        int y4 = Integer.parseInt(JOptionPane.showInputDialog("Digite a Coluna"));

                        int direcao4 = Integer.parseInt(JOptionPane.showInputDialog("1- Horizontal\n"
                                + "2- Vertical \n"));

                        navios.criarNavioDois(direcao4, x4, y4);
                        break;

                    case 6:
                        int x5 = Integer.parseInt(JOptionPane.showInputDialog("Digite a linha"));
                        int y5 = Integer.parseInt(JOptionPane.showInputDialog("Digite a Coluna"));
                        int direcao5 = Integer.parseInt(JOptionPane.showInputDialog("1- Horizontal\n"
                                + "2- Vertical \n"));

                        navios.criarNavioDois(direcao5, x5, y5);

                    case 0:
                        this.vf3 = true;
                        break;
                }
            } while (vf3 = false);

            break;


        case 0:
            this.vf = true;
            break;

    }
}

}
[/code]

[code]package Pacote;

import java.util.Random;

/**
*

  • @author iracema
    */
    public class Navios {

    Mapa mapNavios = new Mapa();
    Random random = new Random();//usada em criarNavioAleatoriamente

    public void criarNavioManualmente(int direcao, int tamanho, int x, int y) {
    switch (direcao) {
    case 1: //lembrando que 1 é horizontal

             for (int a = 0; a < tamanho; a++) {
                 mapNavios.mapa[x][y] = 1;
                 y++;
             }
    
             break;
         case 2:
    
             for (int a = 0; a < tamanho; a++) {
                 mapNavios.mapa[x][y] = 1;
                 x++;
    
             }
             break;
    
    
     }
    

    }

    public void criarNavioAleatoriamente() {

     int tamanho = random.nextInt(4) + 2;// gera numeros aleatorios entre 2 e 5 que na verdade sao os tamanhos dos navios
     int x = random.nextInt(mapNavios.i);
     int y = random.nextInt(mapNavios.j);
    
     int direc = random.nextInt(2) + 1;
    
     switch (direc) {
         case 1:
    
             for (int a = 0; a < tamanho; a++) {
                 mapNavios.mapa[x][y] = 1;
                 y++;
             }
    
             break;
         case 2:
    
             for (int a = 0; a < tamanho; a++) {
                 mapNavios.mapa[x][y] = 1;
                 x++;
    
             }
             break;
     }
    

    }

    public void criarNavioDois(int direcao2, int x, int y) {

     switch (direcao2) {
         case 1:
    
             for (int a = 0; a < 2; a++) {
                 mapNavios.mapa[x][y] = 1;
                 y++;
             }
    
             break;
         case 2:
    
             for (int a = 0; a < 2; a++) {
                 mapNavios.mapa[x][y] = 1;
                 x++;
    
             }
             break;
     }
    

    }

    public void criarNavioTres(int direcao, int x, int y) {
    switch (direcao) {
    case 1:

             for (int a = 0; a < 3; a++) {
                 mapNavios.mapa[x][y] = 1;
                 y++;
             }
    
             break;
         case 2:
    
             for (int a = 0; a < 3; a++) {
                 mapNavios.mapa[x][y] = 1;
                 x++;
    
             }
             break;
     }
    

    }

    public void criarNavioQuatro(int direcao, int x, int y) {

     switch (direcao) {
         case 1:
    
             for (int a = 0; a < 4; a++) {
                 mapNavios.mapa[x][y] = 1;
                 y++;
             }
    
             break;
         case 2:
    
             for (int a = 0; a < 4; a++) {
                 mapNavios.mapa[x][y] = 1;
                 x++;
    
             }
             break;
     }
    

    }

    public void criarNavioCinco(int direcao, int x, int y) {
    switch (direcao) {
    case 1:

             for (int a = 0; a < 5; a++) {
                 mapNavios.mapa[x][y] = 1;
                 y++;
             }
    
             break;
         case 2:
    
             for (int a = 0; a < 5; a++) {
                 mapNavios.mapa[x][y] = 1;
                 x++;
             }
             break;
     }
    

    }
    }
    [/code]

[code]package Pacote;

public class Mapa {

public int i;//numero de linhas
public int j;//numero de colunas
int[][] mapa;



public  void criarMapa(int x){
    this.i=x;
    this.j=x;
    this.mapa=new int[x][x];
    
}

public String apresentarMapa() {
    String map = "";
    for (int x = 0; x < this.i; x++) {
        for (int y = 0; y < this.j; y++) {
            map = map + this.mapa[x][y]+"   ";
            if (y == this.j-1) {
                map = map + "\n";
            }
        }
    }
    return map;


}





}

[/code]

package Pacote;



public class Principal {

    public static void main(String args[]) {
        
        Menu menu = new Menu();
       
        
        do {
            menu.Opcoes();
        } while (menu.vf ==false);
    }
}

Tah ok, desculpa. Não sabia como descrever esse erro

mapNavios é o objeto. Está no topo da classe

Primeiramente, cada vez que você dá um “new” você cria um objeto diferente. Portanto, o objeto mapNavios da classe navios não é o mesmo objeto que o objeto map, da classe menu. Os dois tem o mesmo tipo (assim como eu e vc somos do mesmo tipo, humanos), mas não são o mesmo objeto (assim como eu sou eu, e vc é vc).

Portanto, ao chamar criarMapa, você inicializa o array mapa do objeto map, mas não o array mapa que está dentro de mapNavios.

Para corrigir o problema, você deverá passar o mapa como parâmetro no construtor da classe Navios:

[code]public class Navios {
private Mapa mapNavios;

public Navios(Mapa mapNavios) {
      this.mapNavios = mapNavios;
}
//Resto do código aqui

}[/code]

Observe que agora você é obrigado a criar navios assim:

Mapa map = new Mapa(); Navios navios = new Navios(map);

E que isso fará as classes compartilharem o mesmo mapa.

Fora isso, seria bom você revisar os conceitos de orientação a objetos. Suas classes estão completamente erradas.

Eu constatei o seu mapa ficando null igual como o vini falou

toma cuidado com a orientação a objetos pois em certas ocasiões
se você não tomar cuidado você esquece de passar alguns objetos como parâmetros.

Bom tipo não sou especialista mas algumas observações que acho que dá para você
levar em consideração sobre OO poderiam ser:

0-Na sua classe Main você deve controlar o fluxo de todo o seu projeto
para que não seja preciso ficar acoplando chamadas e instancias demasiadamente
e assim poder ter um acompanhamento do que está ocorrendo, pois o seu main
será o manda chuva do pedaço.

1 - Crie uma classe chamada menus e coloque nela tudo que for
referente a mensagens que deverão ser exibidas para o usuário
Lembrando que pode fazer métodos e fazer eles retornarem a informação que o
user escolheu.

2 - Na sua classe mapa você deve colocar tudo que precisa para ser utilizado
em Mapas ou seja o que mapa precisa para existir…
Precisa de variáveis para guardar os valores de criação de mapas, então tem
que encapsular elas
Precisa de métodos para setar novos valores no mapa e “getar” valores guardados
para exibir o mapa na tela. Assim já dava para resolver também o problema
que tava tendo com o Exception pois o objeto desse mapa seria instanciado
na sua classe main e assim vc poderia acessar ele de lá.

3 - Na sua classe Navios acho que foi o que deixou o vini louco e por isso que ele
endoidou com você ao dizer que suas classes estavam erradas e tals.
Tipo assim se você observar bem você fez vários métodos tecnicamente repitidos

Por exemplo ao invés de no seu for você fazer um método para cada condição
tipo
a<2
a<3
a<4
…etc

você poderia fazer 1 método só e dizer tipo assim:

a < tamanho

e esse tamanho ser parâmetro do seu método também
tipo como

public void criarNavio(int direcao2, int x, int y, int tamanho) {

aí tipo você passa o tamanho na hora que chamar o método criarNavio

assim você economiza usar um tanto de métodos para coisas similares.

[code]
public void criarNavioDois(int direcao2, int x, int y) {
switch (direcao2) {
case 1:

            for (int a = 0; a < 2; a++) {  
                mapNavios.mapa[x][y] = 1;  
                y++;  
            }  

            break;  
        case 2:  

            for (int a = 0; a < 2; a++) {  
                mapNavios.mapa[x][y] = 1;  
                x++;  

            }  
            break;  
    }  
} [/code]

Bom o que pude observar foi mais ou menos isso
mas estou passível de erros também pois não sou tão
experiente igual aos colegas como o vinigodoy hehehe esse é fera mesmo
e se tiver algo que estiver errado no que eu falei
por favor me fala para eu aprender a aperfeiçoar mais.

eu tava debugando aqui ainda e ele já puff deu a solução
parabéns vini hehehe.

bom acho que posso ajudar com isso por enquanto
e tipo assim no livro Java Use a Cabeça tem uns exemplos bacana
sobre como usar OO em jogos e tals para treinar.

Aprendi muito com esse livro.

abraço.

Eu nunca fiz isso. Suspeitei que isso que eu estava fazendo nao fazia sentido. Criar um objeto diferente e querer referenciar a uma coisa de outro objeto. tentei extender a classe Mapa, em Navios mas nao deu certo. Por que?

[quote=ViniGodoy]Primeiramente, cada vez que você dá um “new” você cria um objeto diferente. Portanto, o objeto mapNavios da classe navios não é o mesmo objeto que o objeto map, da classe menu. Os dois tem o mesmo tipo (assim como eu e vc somos do mesmo tipo, humanos), mas não são o mesmo objeto (assim como eu sou eu, e vc é vc).

Portanto, ao chamar criarMapa, você inicializa o array mapa do objeto map, mas não o array mapa que está dentro de mapNavios.

Para corrigir o problema, você deverá passar o mapa como parâmetro no construtor da classe Navios:

[code]public class Navios {
private Mapa mapNavios;

public Navios(Mapa mapNavios) {
      this.mapNavios = mapNavios;
}
//Resto do código aqui

}[/code]

Observe que agora você é obrigado a criar navios assim:

Mapa map = new Mapa(); Navios navios = new Navios(map);

E que isso fará as classes compartilharem o mesmo mapa.

Fora isso, seria bom você revisar os conceitos de orientação a objetos. Suas classes estão completamente erradas.[/quote]
Eu nunca fiz isso. Suspeitei que isso que eu estava fazendo nao fazia sentido. Criar um objeto diferente e querer referenciar a uma coisa de outro objeto. tentei extender a classe Mapa, em Navios mas nao deu certo. Por que?

[quote=JavaDreams]Eu constatei o seu mapa ficando null igual como o vini falou

toma cuidado com a orientação a objetos pois em certas ocasiões
se você não tomar cuidado você esquece de passar alguns objetos como parâmetros.

Bom tipo não sou especialista mas algumas observações que acho que dá para você
levar em consideração sobre OO poderiam ser:

0-Na sua classe Main você deve controlar o fluxo de todo o seu projeto
para que não seja preciso ficar acoplando chamadas e instancias demasiadamente
e assim poder ter um acompanhamento do que está ocorrendo, pois o seu main
será o manda chuva do pedaço.

1 - Crie uma classe chamada menus e coloque nela tudo que for
referente a mensagens que deverão ser exibidas para o usuário
Lembrando que pode fazer métodos e fazer eles retornarem a informação que o
user escolheu.

2 - Na sua classe mapa você deve colocar tudo que precisa para ser utilizado
em Mapas ou seja o que mapa precisa para existir…
Precisa de variáveis para guardar os valores de criação de mapas, então tem
que encapsular elas
Precisa de métodos para setar novos valores no mapa e “getar” valores guardados
para exibir o mapa na tela. Assim já dava para resolver também o problema
que tava tendo com o Exception pois o objeto desse mapa seria instanciado
na sua classe main e assim vc poderia acessar ele de lá.

3 - Na sua classe Navios acho que foi o que deixou o vini louco e por isso que ele
endoidou com você ao dizer que suas classes estavam erradas e tals.
Tipo assim se você observar bem você fez vários métodos tecnicamente repitidos

Por exemplo ao invés de no seu for você fazer um método para cada condição
tipo
a<2
a<3
a<4
…etc

você poderia fazer 1 método só e dizer tipo assim:

a < tamanho

e esse tamanho ser parâmetro do seu método também
tipo como

public void criarNavio(int direcao2, int x, int y, int tamanho) {

aí tipo você passa o tamanho na hora que chamar o método criarNavio

assim você economiza usar um tanto de métodos para coisas similares.

[code]
public void criarNavioDois(int direcao2, int x, int y) {
switch (direcao2) {
case 1:

            for (int a = 0; a < 2; a++) {  
                mapNavios.mapa[x][y] = 1;  
                y++;  
            }  

            break;  
        case 2:  

            for (int a = 0; a < 2; a++) {  
                mapNavios.mapa[x][y] = 1;  
                x++;  

            }  
            break;  
    }  
} [/code]

Bom o que pude observar foi mais ou menos isso
mas estou passível de erros também pois não sou tão
experiente igual aos colegas como o vinigodoy hehehe esse é fera mesmo
e se tiver algo que estiver errado no que eu falei
por favor me fala para eu aprender a aperfeiçoar mais.

eu tava debugando aqui ainda e ele já puff deu a solução
parabéns vini hehehe.

bom acho que posso ajudar com isso por enquanto
e tipo assim no livro Java Use a Cabeça tem uns exemplos bacana
sobre como usar OO em jogos e tals para treinar.

Aprendi muito com esse livro.

abraço.[/quote]

entendi… Vou fazer isso. obrigado pelas dicas

[quote=killerkill][quote=JavaDreams]Eu constatei o seu mapa ficando null igual como o vini falou

toma cuidado com a orientação a objetos pois em certas ocasiões
se você não tomar cuidado você esquece de passar alguns objetos como parâmetros.

Bom tipo não sou especialista mas algumas observações que acho que dá para você
levar em consideração sobre OO poderiam ser:

0-Na sua classe Main você deve controlar o fluxo de todo o seu projeto
para que não seja preciso ficar acoplando chamadas e instancias demasiadamente
e assim poder ter um acompanhamento do que está ocorrendo, pois o seu main
será o manda chuva do pedaço.

1 - Crie uma classe chamada menus e coloque nela tudo que for
referente a mensagens que deverão ser exibidas para o usuário
Lembrando que pode fazer métodos e fazer eles retornarem a informação que o
user escolheu.

2 - Na sua classe mapa você deve colocar tudo que precisa para ser utilizado
em Mapas ou seja o que mapa precisa para existir…
Precisa de variáveis para guardar os valores de criação de mapas, então tem
que encapsular elas
Precisa de métodos para setar novos valores no mapa e “getar” valores guardados
para exibir o mapa na tela. Assim já dava para resolver também o problema
que tava tendo com o Exception pois o objeto desse mapa seria instanciado
na sua classe main e assim vc poderia acessar ele de lá.

3 - Na sua classe Navios acho que foi o que deixou o vini louco e por isso que ele
endoidou com você ao dizer que suas classes estavam erradas e tals.
Tipo assim se você observar bem você fez vários métodos tecnicamente repitidos

Por exemplo ao invés de no seu for você fazer um método para cada condição
tipo
a<2
a<3
a<4
…etc

você poderia fazer 1 método só e dizer tipo assim:

a < tamanho

e esse tamanho ser parâmetro do seu método também
tipo como

public void criarNavio(int direcao2, int x, int y, int tamanho) {

aí tipo você passa o tamanho na hora que chamar o método criarNavio

assim você economiza usar um tanto de métodos para coisas similares.

[code]
public void criarNavioDois(int direcao2, int x, int y) {
switch (direcao2) {
case 1:

            for (int a = 0; a < 2; a++) {  
                mapNavios.mapa[x][y] = 1;  
                y++;  
            }  

            break;  
        case 2:  

            for (int a = 0; a < 2; a++) {  
                mapNavios.mapa[x][y] = 1;  
                x++;  

            }  
            break;  
    }  
} [/code]

Bom o que pude observar foi mais ou menos isso
mas estou passível de erros também pois não sou tão
experiente igual aos colegas como o vinigodoy hehehe esse é fera mesmo
e se tiver algo que estiver errado no que eu falei
por favor me fala para eu aprender a aperfeiçoar mais.

eu tava debugando aqui ainda e ele já puff deu a solução
parabéns vini hehehe.

bom acho que posso ajudar com isso por enquanto
e tipo assim no livro Java Use a Cabeça tem uns exemplos bacana
sobre como usar OO em jogos e tals para treinar.

Aprendi muito com esse livro.

abraço.[/quote]

entendi… Vou fazer isso. obrigado pelas dicas[/quote]

Créditos totais ao Mestre ViniGodoy

eu só dei uma pincelada de carona rsrsrs.

abraço

A extensão é ainda pior.

Obrigado Vinícius, vou procurar corrigir meus erros.

Oi pessoal, Então tentei organizar melhor meu código. Se tiverem mais alguma dica eu aceito.

[code]public class Navio {

Random random = new Random();//usada em criarNavioAleatoriamente

public void criarNavioManualmente(Mapa n, int direcao, int tamanho, int x, int y) {
    this.inserindoNavio(n, direcao, tamanho, x, y);
}

public void criarNavioAleatoriamente(Mapa n){…}
public void criarNavioDois(Mapa n,int direcao, int x, int y){…}
public void criarNavioTres(Mapa n,int direcao, int x, int y){…}
public void criarNavioQuatro(Mapa n,int direcao, int x, int y){…}
public void criarNavioCinco(Mapa n, int direcao, int x, int y){…}

public void inserindoNavio(Mapa n, int direcao, int tamanho, int x,int y){

    switch (direcao) {
        case 1: //lembrando que 1 é horizontal

            for (int a = 0; a < tamanho; a++) {
                Mapa.mapa[x][y] = tamanho;
                y++;
                
            }

            break;
        case 2:

            for (int a = 0; a < tamanho; a++) {
                Mapa.mapa[x][y] = tamanho;
                x++;
        
            }
            break;


    }

}

}
[/code]

[code]public class Menu {

int i, j;
boolean vf = false;
boolean vf3 = false;
int numeroDeLinhas;
Menssagens msg = new Menssagens();
Mapa map = new Mapa();
Navio criarNavios = new Navio();

public void Opcoes() {




    int escolha;

    escolha = msg.menuPrincipal(); //funcao apresenta menu principal
    switch (escolha) {
        case 1:
            int size = msg.mapaSize();// funcao retorna tamanho do mapa
            map.criarMapa(size);
            break;
        case 2:
            JOptionPane.showMessageDialog(null, map.apresentarMapa());
            break;
        case 3:
            do {
                int menu3_1 = msg.menuCriacaoNavios();

                switch (menu3_1) {// aqui é um sub menu do menu principal, aonde eu crio os navios da maneira como desejada
                    case 1:
                        int x = msg.recebeLinha();
                        int y = msg.recebeColuna();
                        int tamanho = msg.tamanhoDoNavio(); // recebe tamanho do navio
                        int direcao1 = msg.recebeDirecao(); //recebe 1 para horizontal ou 2 para vertical

                        criarNavios.criarNavioManualmente(map, direcao1, tamanho, x, y);
                        break;

                    case 2:
                        criarNavios.criarNavioAleatoriamente(map);

                        break;
                    case 3:

                        int x2 = msg.recebeLinha();
                        int y2 = msg.recebeColuna();
                        int direcao2 = msg.recebeDirecao();


                        criarNavios.criarNavioDois(map, direcao2, x2, y2);


                        break;
                    case 4:
                        int x3 = msg.recebeLinha();
                        int y3 = msg.recebeColuna();

                        int direcao3 = msg.recebeDirecao();

                        criarNavios.criarNavioTres(map, direcao3, x3, y3);
                        break;

                    case 5:
                        int x4 = msg.recebeLinha();
                        int y4 = msg.recebeColuna();

                        int direcao4 = msg.recebeDirecao();

                        criarNavios.criarNavioDois(map, direcao4, x4, y4);
                        break;

                    case 6:
                        int x5 = msg.recebeLinha();
                        int y5 = msg.recebeColuna();
                        int direcao5 = msg.recebeDirecao();

                        criarNavios.criarNavioDois(map, direcao5, x5, y5);

                    case 0:
                        this.vf3 = true;
                        break;
                }
            } while (vf3 = false);

            break;
        case 0:
            this.vf = true;
            break;
    }
}

}
[/code]

public class Menssagens { // aqui sao as mensagens pra receber os valores...

    public int menuPrincipal() {...}
public int mapaSize(){...}
public int menuCriacaoNavios(){...}
public int recebeLinha(){...}
public int recebeColuna(){...}
public int tamanhoDoNavio(){...}
public int recebeDirecao(){...}

[code]public class Mapa {

static public int i;//numero de linhas
static public int j;//numero de colunas
static int[][] mapa;



public  void criarMapa(int x){
    Mapa.i=x;
    Mapa.j=x;
    Mapa.mapa=new int[x][x];
    
}

public String apresentarMapa() {
    String map = "";
    for (int x = 0; x < Mapa.i; x++) {
        for (int y = 0; y < Mapa.j; y++) {
            map = map + Mapa.mapa[x][y]+"   ";
            if (y == Mapa.j-1) {
                map = map + "\n";
            }
        }
    }
    return map;


}[/code]

Obrigado pela ajuda de vocês

[quote=killerkill]Oi pessoal, Então tentei organizar melhor meu código. Se tiverem mais alguma dica eu aceito.

[code]public class Navio {

Random random = new Random();//usada em criarNavioAleatoriamente

public void criarNavioManualmente(Mapa n, int direcao, int tamanho, int x, int y) {
    this.inserindoNavio(n, direcao, tamanho, x, y);
}

public void criarNavioAleatoriamente(Mapa n){…}
public void criarNavioDois(Mapa n,int direcao, int x, int y){…}
public void criarNavioTres(Mapa n,int direcao, int x, int y){…}
public void criarNavioQuatro(Mapa n,int direcao, int x, int y){…}
public void criarNavioCinco(Mapa n, int direcao, int x, int y){…}

public void inserindoNavio(Mapa n, int direcao, int tamanho, int x,int y){

    switch (direcao) {
        case 1: //lembrando que 1 é horizontal

            for (int a = 0; a < tamanho; a++) {
                Mapa.mapa[x][y] = tamanho;
                y++;
                
            }

            break;
        case 2:

            for (int a = 0; a < tamanho; a++) {
                Mapa.mapa[x][y] = tamanho;
                x++;
        
            }
            break;


    }

}

}
[/code]

[code]public class Menu {

int i, j;
boolean vf = false;
boolean vf3 = false;
int numeroDeLinhas;
Menssagens msg = new Menssagens();
Mapa map = new Mapa();
Navio criarNavios = new Navio();

public void Opcoes() {




    int escolha;

    escolha = msg.menuPrincipal(); //funcao apresenta menu principal
    switch (escolha) {
        case 1:
            int size = msg.mapaSize();// funcao retorna tamanho do mapa
            map.criarMapa(size);
            break;
        case 2:
            JOptionPane.showMessageDialog(null, map.apresentarMapa());
            break;
        case 3:
            do {
                int menu3_1 = msg.menuCriacaoNavios();

                switch (menu3_1) {// aqui é um sub menu do menu principal, aonde eu crio os navios da maneira como desejada
                    case 1:
                        int x = msg.recebeLinha();
                        int y = msg.recebeColuna();
                        int tamanho = msg.tamanhoDoNavio(); // recebe tamanho do navio
                        int direcao1 = msg.recebeDirecao(); //recebe 1 para horizontal ou 2 para vertical

                        criarNavios.criarNavioManualmente(map, direcao1, tamanho, x, y);
                        break;

                    case 2:
                        criarNavios.criarNavioAleatoriamente(map);

                        break;
                    case 3:

                        int x2 = msg.recebeLinha();
                        int y2 = msg.recebeColuna();
                        int direcao2 = msg.recebeDirecao();


                        criarNavios.criarNavioDois(map, direcao2, x2, y2);


                        break;
                    case 4:
                        int x3 = msg.recebeLinha();
                        int y3 = msg.recebeColuna();

                        int direcao3 = msg.recebeDirecao();

                        criarNavios.criarNavioTres(map, direcao3, x3, y3);
                        break;

                    case 5:
                        int x4 = msg.recebeLinha();
                        int y4 = msg.recebeColuna();

                        int direcao4 = msg.recebeDirecao();

                        criarNavios.criarNavioDois(map, direcao4, x4, y4);
                        break;

                    case 6:
                        int x5 = msg.recebeLinha();
                        int y5 = msg.recebeColuna();
                        int direcao5 = msg.recebeDirecao();

                        criarNavios.criarNavioDois(map, direcao5, x5, y5);

                    case 0:
                        this.vf3 = true;
                        break;
                }
            } while (vf3 = false);

            break;
        case 0:
            this.vf = true;
            break;
    }
}

}
[/code]

public class Menssagens { // aqui sao as mensagens pra receber os valores...

    public int menuPrincipal() {...}
public int mapaSize(){...}
public int menuCriacaoNavios(){...}
public int recebeLinha(){...}
public int recebeColuna(){...}
public int tamanhoDoNavio(){...}
public int recebeDirecao(){...}

[code]public class Mapa {

static public int i;//numero de linhas
static public int j;//numero de colunas
static int[][] mapa;



public  void criarMapa(int x){
    Mapa.i=x;
    Mapa.j=x;
    Mapa.mapa=new int[x][x];
    
}

public String apresentarMapa() {
    String map = "";
    for (int x = 0; x < Mapa.i; x++) {
        for (int y = 0; y < Mapa.j; y++) {
            map = map + Mapa.mapa[x][y]+"   ";
            if (y == Mapa.j-1) {
                map = map + "\n";
            }
        }
    }
    return map;


}[/code]

Obrigado pela ajuda de vocês[/quote]

Oi amigo, na minha opinião ficou 99% mas acho que a culpa foi minha pois falei
para colocar tudo referente a Menu na classe Menu e não expliquei o restante que faltava, por isso aqui vai a dica.

Os switchs dentro da classe Menu ficaram um pouco estranhos no bom sentido de OO.
Para ficar 100% o que eu identifiquei que poderia melhorar seria o seguinte:

1- Como sua classe Menu controla o desenrolar do jogo, então dentro dela você poderia instanciar
os objetos para o jogo “correr”.
Para começar a fazer isso, pegue os dois switchs e faça a abstração de objeto, ou seja
para começar pode fazer um método responsável por pegar a entrada do usuário e ver se ela deve
chamar o Menu parte 1, ou o Menu parte 2 que é o submenu.
A partir daí…
2 - Faça um método para controlar as opções da primeira parte do menu
3 - Faça um método para controlar as opções da segunda parte do menu ou seja o submenu

Agindo dessa forma vai começar a entender um pouco de OO mas no sentido figurado, pois ainda falta algo.

4- Finalmente poderá ver que pode pegar esses 2 métodos e abstrair eles para outra classe ou seja
dentro dessa outra classe você terá dois métodos com funções distintas mas dentro de um mesmo contexto.

Para ficar mais claro, você pode experimentar mudar o nome da classe Menu para Start(ou IniciaJogo)
Depois criar uma outra classe escrito Menus e dentro dela colocar esses dois métodos.

Assim vai entender o que eu queria dizer
e creio que fique mais legal também para aplicar OO e futuramente para você começar a mexer com os padrões de projeto.

Faz um backup antes ok?

Se tiver dúvidas posta aí.
Se alguém quiser acrescentar algo na minha dica fica à vontade
desde que não avacalhe o post, pois analisei o caso mais superficialmente
e falei o que identifiquei.

Abraço.