• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Wasted

Classes e Parametros

7 mensagens neste tópico

Boas noites, tenho como objectivo fazer um programa para gerir um leilão. Deparei-me com um problema: Criei uma class Customer, e no main criei um array dessa classe, o problema e o seguinte: Ha um comando que o utilizador pode fazer para aumentar o deposito do cliente X, ora tudo bem. Entao decidi criar uma função que devolvesse um indice conforme o nome do cliente, mas da-me o seguinte erro:

Exception in thread "main" java.lang.NullPointerException

at Main.searchIndexCustomer(Main.java:83)

at Main.main(Main.java:41)

Mostro-vos o cabecalho da minha função main:

public static void main(String[] args) {

	 Customer customers[];
	 customers = new Customer[50];

nCustomers é o numero de clientes inscritos, é um contador

if ( command.equals(CC)){//CC implica Credit Customer, serve para aumentar o saldo

			int i;
			String name;//Main.main(Main.java:41)
			name = in.nextLine();
			i = searchIndexCustomer(name, nCustomers, customers);
}

public static int searchIndexCustomer(String name, int index, Customer c[]) {//tambem não sei se estou a por bem os parametros..pois preciso de percorrer o vector todo

	int i;
	boolean find = false;
	for ( i = 0; i < index && find == false; i++) 
		if ( c[i].name.equals(name) ) //(Main.java:83)
			find = true;
	if ( find == true )	
		return i;
	else
		return -1;	
}

Não percebo o que está mal..devia de funcionar tudo bem :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há algumas coisas mais estranhas nesse código, por exemplo, declaras customers como um vector e no entanto, pelo que colocaste aqui, o método searchIndexCustomer recebe um Customer.

Depois, se está a dar essa excepção é porque essa posição do vector está vazia e a null, em todo o código que tens não colocaste o código em que preenches o vector. Declaras o vector e reservas 50 espaços para objectos mas não vejo onde colocaste os objectos dentro desse vector.

Caso estejas a colocar lá os objectos, onde estás a preencher o valor de name? Confirma também isso.

Agora aos pontos onde sou sempre o mais chato aqui do fórum :P, esses static têm de desaparecer todos, os valores boolean não precisam ser comparados com false/true, eles podem ser simplesmente usados onde seja necessário usar uma expressão "boleana".

Atenção à indentação, algumas chavetas não fazem mal nenhum e ajudam a perceber melhor o código.

Ex:

public int searchIndexCustomer(String name, int index, Customer c) {
    boolean find = false;
    for (int i = 0; i < index && find; i++)  {
        if ( c[i].name.equals(name) ) {
            find = true;
        }
    }

    if ( find ) {
        return i;
    } else {
        return -1;
    }

//alternativa ao if anterior: return find ? i : -1;
}

Não percebi a que contador te estás a referir.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

peço desculpa, ek ainda sou novo na linguagem java. É assim, eu preciso de criar um array de clientes, pq o sistema vai guardar os clientes registados, logo preciso de um array correcto? E quando faço o deposito de um determinado cliente, tenho de descobrir a posiçao no array.O valor 50 quer dizer que no maximo posso introduzir 50 clientes, sempre que eu adicionar um cliente, o contador nCustomer vai incrementando, entendes? Dai fazer o método de pesquisa de indice. Eu verifiquei e o constructor da class funciona perfeitamente. Ah, o método searchIndexCustomer ta fora do main claro. É que estou mesmo encalhado nisto..Se eu nao meter o customers num parâmetro, ele nao me vai reconhecer a variavel "customers" :S. Se eu modificar desta forma:

public static int searchIndexCustomer(String name, int index) {//como passar o contador?

    boolean find = false;
    int i;
    for (i = 0; i < index && find; i++)  {
        if ( customers[i].name.equals(name) ) {
            find = true;
        }
    }

    if ( find ) {
        return i;
    } else {
        return -1;
    }
}

Ele dá-me erro e diz que "customers cannot be resolved"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se essa variável é importante, e pelo que vejo faz todo o sentido que seja uma variável de instância, retiras de dentro do método main e colocas no topo, logo depois da declaração da classe.

Depois, tens de ver uma coisa, é verdade que declaraste espaço para 50 objectos no vector mas não tens objectos lá dentro, logo ao tentares aceder a uma posição que esteja vazia a invocares um método numa posição vazia, vais obter o erro de NullPointerException, tens de validar se está algo na posição antes de tentares aceder a um objecto nessa posição.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, os erros desapareceram todos mas, agora o programa da-me sempre um fatal error :S

este erro:

java.lang.NoSuchMethodError: main

Exception in thread "main"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hum... retiraste o static do método main? Ou modificaste o método de alguma maneira?

O método main é especial e tem de ser escrito exactamente como public static void main(String[] args)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como disseste para me livrar dos static, tirei-os em todo o lado :x lol. Infelizment acho que me estou a explicar mal, entao aqui vai, vou tentar ser o mais claro possível. Tenho 2 classes, uma class denominada de Customer, e outra arrayCustomer. Mostro aqui o código das duas:

public class Customer {
String name;
float balance;
int reputation;
Article collection[];

Customer (String name,float balance) {

	this.name = name;
	this.balance = balance;
	this.reputation = 100;
}
}

Criei a class arrayCustomer para poder fazer operacoes sobre a class customer, tais como pesquisar pelo Customer, adicionar um deposito etc..

public class arrayCustomer {

int counter = 0;
Article collection[];
Customer[] customers = new Customer[50];

arrayCustomer() {}

void addCustomer(String name, float balance){

	customers[counter] = new Customer(name,balance);
	counter++;

}
void deposit (float amount,String name) { 

	int i;

	i = this.searchIndexCustomer(name);

	customers[i].balance = customers[i].balance + amount;

}
private int searchIndexCustomer(String name) {

    boolean find = false;
    int i;
    for (i = 0; i < counter && find; i++)  {
        if ( customers[i].name.equals(name) ) {
            find = true;
        }
    }

    if ( find ) {
        return i;
    } else {
        return -1;
    }
}
}

Eu entendo o que disseste, criei um array de posicoes vazias, é verdade, mas quando chamo o método addCustomer, ele devia de me preencher os valores na posição counter correcto? O problema é que continua a dar-me o erro Exception in thread "main" java.lang.NullPointerException quando chamo o método addCustomer(). No main inicializei assim a class arrayCustomer:

public static arrayCustomer customers;

public static void main(String[] args) {

Até ai tudo bem..depois da-me é o erro quando chamo o método addCustomer no main:

public static void addCustomer() {

	Scanner in = new Scanner(System.in);
	String name;
	float balance;
	name = in.nextLine();
	balance= in.nextFloat();
	customers.addCustomer(name, balance);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora