Alguém pode dizer onde esta o erro nesses dois códigos?

Alguém sabe o esta o erro nesses dois códigos e a solução?

1º Código

package hobbits;

plublic class Hobbits {

    String name;
    public static void main(String[] args) {
        
        Hobbits h[] = new Hobbits[3];
        int z = 0;
        while( z < 4){
            z = z + 1;
            h[z] = new Hobbits();
            h[z].name = "bilbo";
            if(z == 1){
                h[z].name = "frodo";
            }
            if(z == 2){
                h[z].name = "sam";
            }
            System.out.print(h[z].name + " is a ");
            System.out.println("good Hobbit name");
        }
    }
    
}

2º Código

package bookstestdrive;

    public class Books {
        String title;
        String author;
    }
package bookstestdrive;


public class BooksTestDrive {

    
    public static void main(String[] args) {
        Books book = new Books();
        Books [] myBooks = new Books[3];
        int x = 0;
        myBooks[0].title = "The Grapes of Java";
        myBooks[1].title = "The Java Gatsby";
        myBooks[2].title = "The Java Cookbook";
        myBooks[0].author = "bob";
        myBooks[1].author = "sue";
        myBooks[2].author = "ian";
        
        while( x < 3){
            System.out.print(myBooks[x].title);
            System.out.print(" by ");
            System.out.println(myBooks[x].author);
            x++;
        }
    }
    
}

Então alguém sabe oque esta errado

Olá @Victorhgn2011, ajuda bastante se na hora de postar sua dúvida você colocar o erro que está aparecendo pra você. Mas eu repliquei seu código aqui e achei alguns erros.

na classe Hobbits, você faz z ir de 0 a 4, e acessar 1 a 4 no array h[]. Como você criou um array de 3 posições, e no java por padrão ele começa no 0, seu array tem as posições de 0 a 2. Para resolver isso basta incrementar z no final do seu while, e fazer a verificação para z < 3. Assim ele valerá de 0 a 2.

Versão corrigida:

package hobbits;

public class Hobbits{
    String name;
    public static void main(String[] args) {
        Hobbits h[] = new Hobbits[3];
        int z = 0;
        while( z < 3){
            h[z] = new Hobbits();
            h[z].name = "bilbo";
            if(z == 1){
                h[z].name = "frodo";
            }
            if(z == 2){
                h[z].name = "sam";
            }
            System.out.print(h[z].name + " is a ");
            System.out.println("good Hobbit name");
            z = z + 1;
        }
    }
}

Já na classe BooksTestDrive, você fez o acesso do array certo (de 0 a 2), mas tem um detalhe pequeno. Ao criar um array de objetos em java, como você faz em new Books[3], a linguagem te dá um array com três posições vazias. Logo para cada uma das posições você tem que inserir um novo Books fazendo new Books(). Como o que você fez na primeira linha do main e não usou. Aqui tem uma versão com essas modificações:

package bookstestdrive;

public class BooksTestDrive {


public static void main(String[] args) {
    Books [] myBooks = new Books[3];
    int x = 0;
    myBooks[0] = new Books();
    myBooks[1] = new Books();
    myBooks[2] = new Books();
    myBooks[0].title = "The Grapes of Java";
    myBooks[1].title = "The Java Gatsby";
    myBooks[2].title = "The Java Cookbook";
    myBooks[0].author = "bob";
    myBooks[1].author = "sue";
    myBooks[2].author = "ian";
    
    while( x < 3){
        System.out.print(myBooks[x].title);
        System.out.print(" by ");
        System.out.println(myBooks[x].author);
        x++;
    }
}
}

Se não tiver entendido alguma das coisas que eu falei, só avisar. Espero que ajude :smiley:

1 curtida

Muito obrigado cara!!!

Uma duvida porque coloca myBooks[0] = new Books();?

Então, acho que não consegui explicar direito lá em cima.

Quando você faz:

Books [] myBooks = new Books[3];

O que o java irá fazer é criar um array com três espaços preparados para receber um objeto do tipo Books. Porém, até algo ser efetivamente atribuído a um dos espaços, o java por default colocará dentro deles o valor null.
Você pode fazer o teste e tirar essas linhas, e você deve ver um erro aparecer, chamado nullPointerException, ao tentar executar:

myBooks[0].title

Isso vai acontecer porque você tentou acessar o atributo title, mas esse é um atributo da classe Books e, embora o array esteja preparado para receber Books, lembre-se que dentro dele está o valor null.

Por isso, você precisa colocar lá dentro antes um objeto do tipo Books.

Para instanciar um objeto em java, você chama o método new() da classe, que é um construtor. Esse método vai te retornar um novo objeto daquela classe. Por isso que antes precisamos fazer:

myBooks[0] = new Books();

para as três posições do array. Assim colocamos em casa posição um novo objeto Books em cada uma delas.

Ficou mais claro? :smiley:

1 curtida

Ah! Agora entendi muito obrigado!
Mas saindo desse assunto eu tenho uma outra pequena duvida, se uma classe for declarada publica estando no pacote gato eu posso acesa-la na classe Cachorro que esta no pacote cachorro?