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 
1 curtida
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? 
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?