Jump to content

pequena dúvida


DiogoAfonso
 Share

Recommended Posts

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.