Funcao so funciona dentro do catch

Dae galera,

estou tendo o seguinte problema. Tenho um metodo de uma classe que se chama double leSaida();
Este metodo eh chamado diversas vezes por 2 threads diferentes, para tentar achar o erro eu fiz o seguinte

public double leSaida(){
double saida=0;
int tamanho=saidas.size()-1;

    if(saidas.isEmpty()){
        saida=0.0;
    }else{
       
        try{
            saida=(Double)saidas.get(tamanho);
          }catch(Exception e){
            System.out.println("aaaaaahhhhhhhhhhhh");
            System.out.println(saidas.size());
            System.out.println(tamanho);
            System.out.println((Double)saidas.get(tamanho));
            
    }
      
    }
    
    return saida;
}

Quando eu rodo minha aplicacao, em determinado momento eu tenho a saida:

aaaaaahhhhhhhhhhhh
4
3
3.1999755859375

ou seja, ele tenta ler o valor do array saidas, nao consegue e entra no catch. Dentro do catch ele consegue fazer tudo certinho.
O que eu nao entendo eh porque ele nao consegue achar esse valor logo de primeira. Alguem saberia me dizer:??

Obrigado

Olá roztal,

utilize a tag code no seu código para facilitar pra galera.
Se possível, poste aqui o stacktrace da sua sua exceção, para nos ajudar a localizar o erro.

Eu arriscaria dizer, já que você disse que está usando threads, que o List saidas ainda não está inicializado no momento do try.
Abraços

[quote=roztal]Dae galera,

estou tendo o seguinte problema. Tenho um metodo de uma classe que se chama double leSaida();
Este metodo eh chamado diversas vezes por 2 threads diferentes, para tentar achar o erro eu fiz o seguinte

 public double leSaida(){
        double saida=0;
        int tamanho=saidas.size()-1;
        
        if(saidas.isEmpty()){
            saida=0.0;
        }else{
           
            try{
                saida=(Double)saidas.get(tamanho);
              }catch(Exception e){
                System.out.println("aaaaaahhhhhhhhhhhh");
                System.out.println(saidas.size());
                System.out.println(tamanho);
                System.out.println((Double)saidas.get(tamanho));
                
        }
          
        }
        
        return saida;
    }

Quando eu rodo minha aplicacao, em determinado momento eu tenho a saida:

aaaaaahhhhhhhhhhhh
4
3
3.1999755859375

ou seja, ele tenta ler o valor do array saidas, nao consegue e entra no catch. Dentro do catch ele consegue fazer tudo certinho.
O que eu nao entendo eh porque ele nao consegue achar esse valor logo de primeira. Alguem saberia me dizer:??

Obrigado[/quote]

O problema esta na linha do try:

saida=(Double)saidas.get(tamanho);

Isso ocorre porque o atributo saida é do tipo primitivo double e você esta tentando setar com um objeto Double.

No catch funciona porque no você esta jogando no println o objeto sem tentar setar no atributo saida e o println aceita objetos.

Resolve se fizer assim:

saida = ((Double)saidas.get(tamanho)).doubleValue();
//ou
saida = Double.parseDouble((Double)saidas.get(tamanho));

Não esqueça de tratar caso caso venha nulo para não receber um NullPointerException.

Abraços,

opa…

Exception in thread “Thread-5” java.lang.NullPointerException
at Motor.TesteMotorVirtual.leSaida(TesteMotorVirtual.java:44)
at Motor.MotorVirtual.leSaida(MotorVirtual.java:38)
at Seguranca.Seguranca.motorOK(Seguranca.java:73)
at Seguranca.Seguranca.avaliaMotor(Seguranca.java:87)
at Seguranca.Seguranca.run(Seguranca.java:65)

TesteMotorVirtual.leSaida

[code]public double leSaida(){
double saida=0;
int tamanho=saidas.size()-1;

    if(saidas.isEmpty()){
        saida=0.0;
    }else{
       
       // try {
            saida = (Double) saidas.get(tamanho);
        //} catch (Exception e) {
        //    System.out.println("aaaaaahhhhhhhhhhhh");
        //    System.out.println(saidas.size());
        //    System.out.println(tamanho);
         //   System.out.println((Double) saidas.get(tamanho));
         //   saida = (Double) saidas.get(tamanho);

        //}
      
    }
    
    return saida;
}[/code]

MotorVirtual.leSaida

public double leSaida() { double saidaMomento=0; [b]saidaMomento=virtual.leSaida(); [/b] return saidaMomento; }

A classe seguranca eh uma Thread independente que fica rodando e lendo a saida do motor, se a saida for maior ou menor do que o estipulado, ela vai parar o motor. mas o problema esta no le saida do motor

Seguranca.motorOK

[code]public boolean motorOK(){
boolean motorOk = false;
double saida=obMotor.leSaida();

    if(saida<=obMotor.getDoSaidaMax()&&saida>=obMotor.getDoSaidaMin()){
        motorOk=true;
    }        
    return motorOk;
}[/code]

isso ajuda?? hehe

mudei para:

saida = ((Double)saidas.get(tamanho)).doubleValue();

como o rodrigoK disse mas ele continua entrando no catch 8(

Por um acaso, se muitas Threads tiverem lendo varias vezes os valores de um unico ArrayList, isso pode dar problema/?? Que eu acho que talvez seja isso que esteja acontecendo comigo…

vlw

abrs

Problema resolvido…
Uma das threads que acessava o array estava tinha sido configurada (erroneamente) para dormir por 0 milisegundos, ou seja, ficar constantemente acessando o array. Isso estava baguncando o array. Na verdade eu nao sabia que isso era pra dar problema, mas quando eu arrumei o tempo do sleep parou de dar problema!!

vlw