DiogoAfonso Posted March 11, 2012 Report Share Posted March 11, 2012 Boas pessoal, estava aqui a tentar fazer uma pequena coisa em java, algo simples. Criar um objecto e manipular os seus valores, isto com um array de objectos. Tenho aqui o código: import java.util.Scanner; public class ClassTest { public int num; public String name; final static int MAX_SIZE = 3; public ClassTest (int num, String name) { this.num = num; this.name = name; } public int getNum() { return num; } public String getName() { return name; } public String toString() { return "O meu nome é "+getName()+" e o meu numero é "+getNum(); } public void toRead(Scanner in) { name = in.next(); num = in.nextInt(); } public static void main (String[] args) { Scanner in = new Scanner (System.in); ClassTest[] test = new ClassTest[MAX_SIZE]; System.out.println("Insira o seu nome e numero: "); for (int i = 0; i < test.length; ++i) test[i].toRead(in); for (int i = 0; i < test.length; ++i) System.out.println(test.toString()); } } só que quando tento correr dá este erro Insira o seu nome e numero: Exception in thread "main" java.lang.NullPointerException at ClassTest.main(ClassTest.java:35) Isto é o que está na linha 35 test.toRead(in);, é o que faz o primeiro for. Não percebo porque é que dá este erro. O que estou a fazer de mal!? Cumprimentos e obrigado 😉 Link to comment Share on other sites More sharing options...
Fest Posted March 12, 2012 Report Share Posted March 12, 2012 Olá Diogo, tudo bem? Bem, eu não sou nenhum guru, mas o erro que estás a ter é devido ao facto de estares a chamar uma posição do teu array test que não tem nada, ou seja, está a null. Quando tu fazes ClassTest[] test = new ClassTest[MAX_SIZE] só estás a dizer para que seja criado um array com MAX_SIZE casas (posições de memória), que são inicializadas a null. Assim quando fazes test[i].toRead(in) estás a aceder a uma posição com valor null. Outra coisa, que não é um erro mas que não sei se é boa prática, é teres a leitura incorporada na classe, estou me a referir ao toRead(Scanner in). Normalmente estas operações ficam à responsabilidade do programa, ou seja, de classes que presentam a execução do programa como o main e não das classes de estrutura (digamos que a tua classe ClassTest era uma classe que criava objectos que representariam alunos), mas isto pode ser só falta de hábito meu 😉. Vou te apresentar duas soluções, a que me faria mais sentido (sem o toRead(Scanner in)) e uma com o que tens. Sem toRead(Scanner in): import java.util.Scanner; public class ClassTest { public int num; public String name; final static int MAX_SIZE = 3; public ClassTest (int num, String name) { this.num = num; this.name = name; } public int getNum() { return num; } public String getName() { return name; } public String toString() { return "O meu nome é "+getName()+" e o meu numero é "+getNum(); } //Não usado public void toRead(Scanner in) { name = in.next(); num = in.nextInt(); } public static void main (String[] args) { Scanner in = new Scanner (System.in); ClassTest[] test = new ClassTest[MAX_SIZE]; int x; //Estas variáveis são criadas para receberem os valores String y; // da consola e depois iniciarem o objecto System.out.println("Insira o seu nome e numero: "); for (int i = 0; i < test.length; ++i){ y = in.nextLine().trim(); //uso o nextLine() porque o nome pode ter mais que uma palavra //e o next() só lê até ao primeiro espaço encontrado, sendo que //os restantes nomes seriam depois lidos no nextInt(), o que dava um erro x = in.nextInt(); test[i] = new ClassTest(x, y); in.nextLine(); //nextInt() não lê tudo, quando escreves 123 e fazes enter, o enter não é lido e fica //no buffer que depois era lido pelo próximo acesso ao buffer, o que pode originar erro. //Ao fazer in.nextLine() leio o <enter> e fico com o buffer limpo } for (int i = 0; i < test.length; ++i) System.out.println(test[i].toString()); } } Com toRead(Scanner in): import java.util.Scanner; public class ClassTest { public int num; public String name; final static int MAX_SIZE = 3; public ClassTest (int num, String name) { this.num = num; this.name = name; } public int getNum() { return num; } public String getName() { return name; } public String toString() { return "O meu nome é "+getName()+" e o meu numero é "+getNum(); } public void toRead(Scanner in) { name = in.nextLine(); num = in.nextInt(); in.nextLine(); } public static void main (String[] args) { Scanner in = new Scanner (System.in); ClassTest[] test = new ClassTest[MAX_SIZE]; System.out.println("Insira o seu nome e numero: "); for (int i = 0; i < test.length; ++i){ test[i] = new ClassTest(0, ""); //aqui tinha duas opções, ou criava um //novo construtor sem argumentos ou metia valores por defeito test[i].toRead(in); } for (int i = 0; i < test.length; ++i) System.out.println(test[i].toString()); } } Espero ter ajudado, seja como for, espera que alguém com mais experiência te diga algo. Boa Sorte, Fábio Tavares. Link to comment Share on other sites More sharing options...
DiogoAfonso Posted March 12, 2012 Author Report Share Posted March 12, 2012 Obrigado pela ajuda Fábio. Mais tarde percebi que o erro estava no facto de o construtor ter parâmetros. Fiz um pequeno teste e percebi isso 😉 Mas com as tuas duas soluções já percebi o que tinha de fazer!!! Obrigado e cumprimentos. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now