Erro de NullPointerException

21 respostas
K

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:

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;
        }
Agora, o trecho do código em Menu.java citado pelo erro
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;

alguém pode me ajudar?

21 Respostas

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

navios navios = new navios();

navios.criarNavioDois(direcao2, x2, y2);
JavaDreams

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.

K
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

navios navios = new navios();

navios.criarNavioDois(direcao2, x2, y2);

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:

public class Menu {

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

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.

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;  
        }
public void criarNavioDois(int direcao2, int x, int y) {
Aqui qual o Valor que esta chegando para x e y?

Abraço.

ViniGodoy

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.

ViniGodoy

Onde você criou a variável mapNavios?

K

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

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;

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


    }
    
    
    

    
    }
package Pacote;



public class Principal {

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

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

K

mapNavios é o objeto. Está no topo da classe

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:
public class Navios {  
    private Mapa mapNavios;

    public Navios(Mapa mapNavios) {
          this.mapNavios = mapNavios;
    }
    //Resto do código aqui
}
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.

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.

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

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.

K

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?

K
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:
public class Navios {  
    private Mapa mapNavios;

    public Navios(Mapa mapNavios) {
          this.mapNavios = mapNavios;
    }
    //Resto do código aqui
}
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 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?

K
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.

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

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.

entendi... Vou fazer isso. obrigado pelas dicas

JavaDreams
killerkill:
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.

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

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.

entendi... Vou fazer isso. obrigado pelas dicas

Créditos totais ao Mestre ViniGodoy

eu só dei uma pincelada de carona rsrsrs.

abraço

ViniGodoy

A extensão é ainda pior.

K

Obrigado Vinícius, vou procurar corrigir meus erros.

K
Oi pessoal, Então tentei organizar melhor meu código. Se tiverem mais alguma dica eu aceito.
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;


        }
    
    }
}
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;
        }
    }
}
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(){...}
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;


    }

Obrigado pela ajuda de vocês

JavaDreams
killerkill:
Oi pessoal, Então tentei organizar melhor meu código. Se tiverem mais alguma dica eu aceito.
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;


        }
    
    }
}
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;
        }
    }
}
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(){...}
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;


    }

Obrigado pela ajuda de vocês

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.

K
Então, acho que não entendi muito bem. Fiz o seguinte: Criei mais uma classe chamada "Menus", renomeei a antiga para "Iniciar". Nessa nova classe Menus coloquei 2 métodos: menuPrincipal e menuCriarNavios. Em "Iniciar" eu instancio o objeto de Menus e faço menuPrincipal rolar enquanto nao receber 0(sair). Depois na classe principal eu finalmente instancio o objeto de Menus pra de fato rolar o jogo. Problemas: Não acontece nenhum erro porém não consigo mais execultar o jogo. Apenas constroi e pronto. Um outro problema que vinha enfrentando desde antes é que das opções de criar navios a unica que funciona é a 1(Criar navios Manualmente) e a 2(criar navio Aleatoriamente). Quando as outras opçoes, como por exemplo "criar navio tamanho 5 " é acionada, o programa cria um navio tamanho 2. isso acontece em todas as opções: Criar navio tamanho 2 3 4 e 5. Mesmo eu passando como parametro o tamanho respectivo desejado. Não entendi. Veja como ficou minha organização do código:
public class Menus {

    Navio criarNavios = new Navio();
    Mapa map = new Mapa();
    Menssagens msg = new Menssagens();

    public boolean menuPrincipal() {

        int escolha = msg.menuPrincipal(); //funcao apresenta menu principal
        boolean vfp = false;

        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:
                boolean vf;
                do {
                    vf = this.menuCriacaoDeNavios();
                } while (vf = false);

                break;
            case 0:
                vfp = true;
                break;
        }
        return vfp;
    }

    public boolean menuCriacaoDeNavios() {
        boolean vf = false;
        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:
                criarNavios.criarNavioManualmente(map, msg.recebeDirecao(), msg.tamanhoDoNavio(), msg.recebeLinha(), msg.recebeColuna());
                break;

            case 2:
                criarNavios.criarNavioAleatoriamente(map);

                break;
            case 3:

                criarNavios.criarNavioDois(map, msg.recebeDirecao(), msg.recebeLinha(), msg.recebeColuna());
                break;
            case 4:
                criarNavios.criarNavioTres(map, msg.recebeDirecao(), msg.recebeLinha(), msg.recebeColuna());
                break;

            case 5:

                criarNavios.criarNavioDois(map, msg.recebeDirecao(), msg.recebeLinha(), msg.recebeColuna());
                break;

            case 6:
                criarNavios.criarNavioDois(map, msg.recebeDirecao(), msg.recebeLinha(), msg.recebeColuna());

            case 0:
                vf = true;
                break;
        }
        return vf;

    }
}
public class Iniciar {

    Menus menus = new Menus();

    public Iniciar() {
        boolean loop;
        do {
            loop = menus.menuPrincipal();
        } while (loop == false);

    }
}
public class Principal {

    public static void main(String args[]) {

        
     Iniciar start=new Iniciar();   
    }
}

Há ainda a classe Navio, Mensagens e Mapa. Vou mostrar um dos métodos da classe navio pra você ver se consegue identificar oque está errado com o problema da criação desses navios.

public class Navio {

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

public void criarNavioManualmente(Mapa n, int direcao, int tamanho, int x, int 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) {

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

        switch (direcao) {
            case 1: //lembrando que 1 é horizontal
                System.out.println(tamanho);
                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;

        }

    }
}

Obrigado =D

K

Ops, desculpa. Eu suspeitei que fosse bug do programa. reiniciei o netBens aqui e o programa funcionou. Mas continuo com o problema da criação dos navios

Criado 19 de agosto de 2013
Ultima resposta 24 de ago. de 2013
Respostas 21
Participantes 4