Problemas com "lixo" em variavel

17 respostas
R

Fala galera…

seguinte…tenho um metodo q eh usado por mtas outras classes…
o retorno do metodo eh uma matriz com alguns dados e o ultimo campo contem um dado q dependendo do valor dele, impede o usuario de fazer uma operacao…

o problema eh q estah ficando algum tipo de lixo na variavel, pois o metodo devolve os dados corretos, mas esse ultimo campo vem com dado errado, como se tivesse ficado um resto de outra chamada…o mais estanho eh q, embora a variavel seja de classes, qdo entra no metodo chamo outro metodo q inicializa todas as variaveis…

alguem poderia ajudar, pois com esse problema necessito ficar parando e iniciando o tomcat para limpar tudo…

o q poderia ser???

valew

17 Respostas

maxguzenski

isso ta meio “místico” :twisted:

se puder me manda as classes, dou uma olhanda

C

Olá Colega,

Você pode estar tendo problemas devido à sincronização de acessos no servlet, envie sua classe para que possamos dar uma olhada (ou pelo menos os trechos de código que inicializam e lidam com este vetor).

[]s

Carlos H

R

bom, tentando esclarecer um pouco as coisas…

chamo esse metodo na classe clsCalculaTempo:

public static int[][] calculaIntervalo(int pintChProg, int pintChProf, int pintChEst, int pintChFas, Timestamp ptsInicio, Timestamp ptsTermino)
{
String [][] strCalcTempo = new String[500][10];
//armazena a matriz retornada do metodo calculaTempo
strCalcTempo = calculaTempo(pintChProg, pintChProf,pintChEst,pintChFas,ptsInicio,ptsTermino);

esse metodo chama o metodo calculaTempo q devolve a matriz com os dados…mas como podem ver a matriz eh iniciada toda vez q entra no metodo…

public static String[][] calculaTempo(int pintChProg, int pintChProf, int pintChEst, int pintChFas, Timestamp ptsInicio, Timestamp ptsTermino)
{
inicializa();
public static void inicializa()
{
	//inicializa todas as variaveis
	bolTelaConAtividade		= true;
	bolDiaInicio			= true;

	intIndiceOcoHorario   = -1;
	intIndiceListaDatas   = -1;
	intIndiceMatrizTempos = -1;
	intMinutos			  = 0;
	intTipoLiberacao      = 0;

	dtChHorario		= null;
	dtEntrada		= null;
	dtAlmocoSaida	= null;
	dtAlmocoVolta	= null;
	dtSaida			= null;
	dtExtraEntrada1 = null;
	dtExtraSaida1	= null;
	dtExtraEntrada2 = null;
	dtExtraSaida2	= null;
	dtDataAlteracao = null;

	dtDataAuxiliar	= null;

	dtInicioFase	= null;
	dtDataTermino   = null;
	dtDataSistema	= null;
	dtUltimaData	= null;

	strOcoHorario	= new String[500][10];
	strMatrizTempos = new String[500][10];
	dtListaDatas	= new Date[500][10];

	Liberacao		= new clsLiberacao();
	PtoHorario		= new clsPtoHorario();
	DesenvProg		= new clsDesenvProg();
	Feriado			= new clsFeriado();
}

estranho certo?? o q pode ser??[/code]

maxguzenski

bah, mas tudo estatico!

seguinte, pelo que vi as classes Strins[][] dentro de incializar tambem são estaticas (levando em concideracao que eles nao sao declaradas dentro do metodo)

bom, o q aconteceria se algum usário acessasse essas funcoes antes de outro usuário terminar de usa-las? resp.: os valores se misturariam

R

entao…

uma coisa q percebi eh q onde ocorre o problema eh q chamo direto o metodo, sem instanciar a classe…

faco isso:

Classe.metodo();

ao inves disso:

Classe = new Classe();
Classe.metodo();

isso teria alguma interferencia??

[/code]

maxguzenski

isso nao mudaria em nada seu problemas, pois os metodos e variaveis continuariam sendo statics…

ou voce retira o statics de tudo ou sincroniza o acesso (mais complicado)

sincronyzed (this) {

// chama os metodos

}

mas nesse caso tem que elaborar melhor

C

Uma coisa eu não entendi: porque a string precisa ser estática?

Aliás, mesmo retirando o modificador static, lembre-se que precisará sincronizar o acesso mesmo assim! Pois o container servlet pode utilizar uma mesma instancia para diversos clientes web, assim… a mesma variável seria compartilhada entre vários!

[]s

Carlos H.

R

mas Carlos…

nao posso deixar esse metodo sincronizado…ele eh acessado muitas vezes…

sincronizando o metodo, poderia causar uma demora nas operacoes do sistema, certo?? nao sei se seria interessante…

valew

C

Certo, mas aí é que mora o perigo, afinal, se ele é lido/escrito por diversas threads simultaneamente, você corre o risco de ter informações corrompidas.

Lembre-se também que você não precisa sincronizar um método completo, mas apenas um trecho de código

synchronized (meuObjeto) {

// código

}

Assim você otimiza o código mantendo apenas aquele trecho específico sincronizado.

cv1

rbarioni, 5 coisas que vc precisa fazer nesse codigo:

  • Reduzir o numero de parametros (encapsulando mais dados em objetos)
  • Remover as atribuicoes a null, que nao servem pra nada
  • Tirar os statics (que estão causando o seu problema)
  • Usar mais objetos ao inves de ter 80% dos dados em String[][] (“stringificação” é algo muito perigoso no design)
  • Usar um padrão de nomes para variáveis decente. Isso tá parecendo código de 1975, escrito em PL/I, onde a galera achava bonito não ter vogais nos nomes de variáveis :smiley:

Sobre o problema da stringificação, tem um artigo muito bacana escrito na DeveloperWorks sobre isso:

http://www-106.ibm.com/developerworks/java/library/j-string/

R

cv, jah tirei todos os static da classe, mas mesmo assim, de vez em qdo acontece o mesmo problema…

qual o problema com os nomes de variaveis?? os nomes dizem os q as variaveis armazenam, oras…

jogamos null nas variaveis p/ assegurar q nao sera atribuido nada mesmo no inicio das variaveis…p/ garantir q sao nulas antes de receberem valores…

caiofilipini

Mas se essas variáveis são atributos de uma classe, elas já recebem null por padrão… :wink:

R

como eu disse, caio…eh mais uma confirmacao de inicializacao das variaveis…

isso nao traz problema algum…nao tenho problema de NPE…

o problema q ocorre eh em um campo da matriz, em algumas situacoes…mas ainda nao conseguimos definir qdo isso ocorre…

caiofilipini

Não é recomendável confiar nessa inicialização padrão?

R

nesse caso, nao Caio…pois esse eh um metodo fundamental p/ o funcionamento do sistema…

caiofilipini

Ok, rbarioni. Valeu pela força! :smiley:

[]'s

dukejeffrie

Tipo, tá na cara que falta uma sincronizacao nisso aih. O sintoma de acesso indevido é justamente esse: parte dos dados corresponde a uma thread, parte dos dados à outra.

Se vc nao quer sincronizar nas matrizes, ainda mais pq vc vai querer dados diferentes mesmo, vc pode usar ThreadLocal. Mas tem que saber o que está fazendo.

De qq forma, vc pode pedir como argumento a matriz. Isso tb garante que cada request vai criar a sua e uma nao vai interferir na outra.

[]s!!

Criado 4 de agosto de 2003
Ultima resposta 8 de set. de 2003
Respostas 17
Participantes 6