PDA

View Full Version : [java] spostare metodi


raniero
21-04-2006, 18:54
Ciao, vorrei spostare due metodi (guardainCassetta e prendiAttrezzi) dalla classe Operaio alla classe CassettaAttrezzi ,ma sto incontrando un problema, del tipo:

java.lang.NullPointerException
at com.officina.Operaio.riparaMacchina(Operaio.java:39)
at com.officina.Operaio.aggiusta(Operaio.java:96)
at com.officina.Operaio.run(Operaio.java:66)

come mai?

vi posto le due classi in origine e poi la mia soluzione (errata!)


origine :

package com.officina;

import java.util.ArrayList;
import com.simulazione.Main;
import com.simulazione.GeneratoreDiGuasti;
import com.officina.StopWatch;

public class Operaio extends Thread{
private Macchina vetturaDaRiparare;
private CassettaAttrezzi cassettaAttrezzi;
private Guasto guasto;
private Officina officina;
private ArrayList saccaAttrezzi;
private ArrayList attrezzicheck;
static long tsimulato;
static int lavori=0;
static long TsMAX =0;
static long TempoAttL;
static long AttLMAX =0;
private boolean hoAspettato;



public Operaio(String nome, Officina officina) throws Exception{
this.saccaAttrezzi = new ArrayList();
this.setName(nome);
this.officina = officina;
this.cassettaAttrezzi = officina.prendiCassettaAttrezzi();
this.hoAspettato = false;
Main.log.writeINF("Creato meccanico <" + nome + ">");
}

public boolean guardainCassetta(Macchina m) throws Exception{
attrezzicheck = new ArrayList();
guasto = m.analizzaMacchina();
for(int i = 0; i < guasto.decidiAttrezzi().length; i++){
String nomeAttrezzo = guasto.decidiAttrezzi()[i];
attrezzicheck.add(nomeAttrezzo);
}
return cassettaAttrezzi.disponibilita(attrezzicheck);
}

public void prendiAttrezzi(ArrayList Attrezzicheck) throws Exception{

for(int i = 0; i < Attrezzicheck.size(); i++){
String nomeAttrezzo = (String)Attrezzicheck.get(i);
saccaAttrezzi.add(cassettaAttrezzi.prendiAttrezzo(nomeAttrezzo));}
Attrezzicheck.clear();
}

private void riparaMacchina() throws Exception {
StopWatch timerAttesaLav= new StopWatch();
Main.log.writeINF("Meccanico <" + getName()
+ "> ripara <" + vetturaDaRiparare.getName() + ">"
+ " con <" + guasto.datiGuasto() + ">");
timerAttesaLav.start();
long lTmp = guasto.rilevaTempoRiparazione();
Main.log.writeDBG("Meccanico <" + getName() + "> bloccato per <"
+ lTmp + "> Minuti");
timerAttesaLav.stop();
TempoAttL+= timerAttesaLav.getElapsedTime();
if (timerAttesaLav.getElapsedTime()>AttLMAX){
AttLMAX=timerAttesaLav.getElapsedTime();
}
sleep(lTmp);
tsimulato+= lTmp;
if (lTmp>TsMAX){
TsMAX=lTmp;
}
}

public void run(){


while(true){
try {
if (!hoAspettato)
vetturaDaRiparare = officina.prendiMacchinaDaRiparare();
if (this.vetturaDaRiparare!=null){
this.aggiusta();
}
// yield();

}
catch (Exception e){
e.printStackTrace();
}

}

}

private void svuotaSacca(ArrayList sacca) throws Exception{
for (int i = 0; i < sacca.size(); i++){
Attrezzo attrezzo = (Attrezzo) sacca.get(i);
cassettaAttrezzi.riponiAttrezzo(attrezzo);
}
sacca.clear();
}

private void aggiusta () throws Exception{


if (this.guardainCassetta(vetturaDaRiparare)){
this.prendiAttrezzi(attrezzicheck);
if (this.hoAspettato){
officina.setopInAttesa(false);
this.hoAspettato = false;
}
this.riparaMacchina();
this.svuotaSacca(saccaAttrezzi);
officina.riponiMacchinaRiparata(vetturaDaRiparare);
lavori++;
this.ScriviStatistiche();
}
else {
this.hoAspettato = true;
officina.setopInAttesa(true);
}
}

public void ScriviStatistiche() {
if ((GeneratoreDiGuasti.timer.getElapsedTime()%20)==0 &&(lavori != lavori+1) ){
GeneratoreDiGuasti.timer.scriviTempoTot(); }
}
}




package com.officina;

import java.util.ArrayList;
import com.simulazione.Main;

public class CassettaAttrezzi{
private ArrayList attrezzi;
static long TempoAtt;
private int z =1;
static long AttMAX =0;
static long blocco=1;
boolean trovato;

public CassettaAttrezzi(){
this.attrezzi = new ArrayList();

}

public synchronized Attrezzo prendiAttrezzo(String nome) throws InterruptedException{
StopWatch timerAttesa= new StopWatch();
Main.log.writeDBG("Ho bisogno dell'attrezzo <" + nome + ">");
Attrezzo attrRet = null;
while(attrRet == null){
for (int i = 0; i < attrezzi.size(); i++){
Attrezzo attrezzo = (Attrezzo) attrezzi.get(i);
if (attrezzo.equals(nome)){
attrRet = (Attrezzo)attrezzi.remove(i);
Main.log.writeDBG("Recuperato attrezzo <" + attrRet.getName() + ">");
break;
}
}
if (attrRet == null){
timerAttesa.start();
Main.log.writeDBG("IN ATTESAAAAAAAA DELL ' ATTREZZO <" + nome + ">");
blocco++;

wait();
timerAttesa.stop();
TempoAtt+= timerAttesa.getElapsedTime();
if (timerAttesa.getElapsedTime()>AttMAX)
AttMAX=timerAttesa.getElapsedTime();
}
}
return attrRet;
}

public synchronized void riponiAttrezzo(Attrezzo attrezzo){
Main.log.writeDBG("Rilascio attrezzo <" + attrezzo.getName() + ">");
attrezzi.add(attrezzo);
notify();
}


public synchronized boolean disponibilita (ArrayList listaAttrezzicheck) throws InterruptedException {

for (int i =0;i<listaAttrezzicheck.size();i++)
{
String attrezzocheck = (String)listaAttrezzicheck.get(i);
boolean trovato = false;


for (int j=0; (!trovato) && j< attrezzi.size() ;j++)
{
Attrezzo attrezzocass = (Attrezzo) attrezzi.get(j);
if (attrezzocass.equals(attrezzocheck)) trovato = true;
}
if (!trovato) {
Main.log.writeDBG("NO PUEDO TRABAHAR");
wait();

return false ;
}

}
Main.log.writeINF ( " VEDO gli attrezzi in Cassetta --> lavoro n° " +z++); //
return true;
}


}


mia soluzione sbagliata:

package com.officina;

import java.util.ArrayList;
import com.simulazione.Main;
import com.simulazione.GeneratoreDiGuasti;
import com.officina.StopWatch;

public class Operaio extends Thread{
private Macchina vetturaDaRiparare;
private CassettaAttrezzi cassettaAttrezzi;
private Guasto guasto;
private Officina officina;
private ArrayList saccaAttrezzi;

static long tsimulato;
static int lavori=0;
static long TsMAX =0;
static long TempoAttL;
static long AttLMAX =0;
private boolean hoAspettato;



public Operaio(String nome, Officina officina) throws Exception{
this.saccaAttrezzi = new ArrayList();
this.setName(nome);
this.officina = officina;
this.cassettaAttrezzi = officina.prendiCassettaAttrezzi();
this.hoAspettato = false;
Main.log.writeINF("Creato meccanico <" + nome + ">");
}





private void riparaMacchina() throws Exception {
StopWatch timerAttesaLav= new StopWatch();
Main.log.writeINF("Meccanico <" + getName()
+ "> ripara <" + vetturaDaRiparare.getName() + ">"
+ " con <" + guasto.datiGuasto() + ">");
timerAttesaLav.start();
long lTmp = guasto.rilevaTempoRiparazione();
Main.log.writeDBG("Meccanico <" + getName() + "> bloccato per <"
+ lTmp + "> Minuti");
timerAttesaLav.stop();
TempoAttL+= timerAttesaLav.getElapsedTime();
if (timerAttesaLav.getElapsedTime()>AttLMAX){
AttLMAX=timerAttesaLav.getElapsedTime();
}
sleep(lTmp);
tsimulato+= lTmp;
if (lTmp>TsMAX){
TsMAX=lTmp;
}
}

public void run(){


while(true){
try {
if (!hoAspettato)
vetturaDaRiparare = officina.prendiMacchinaDaRiparare();
if (this.vetturaDaRiparare!=null){
this.aggiusta();
}
// yield();

}
catch (Exception e){
e.printStackTrace();
}

}

}

private void svuotaSacca(ArrayList sacca) throws Exception{
for (int i = 0; i < sacca.size(); i++){
Attrezzo attrezzo = (Attrezzo) sacca.get(i);
cassettaAttrezzi.riponiAttrezzo(attrezzo);
}
sacca.clear();
}

private void aggiusta () throws Exception{


if (cassettaAttrezzi.guardainCassetta(vetturaDaRiparare, guasto)){
cassettaAttrezzi.prendiAttrezzi(cassettaAttrezzi.prendiAttrezzicheck(), saccaAttrezzi);
if (this.hoAspettato){
officina.setopInAttesa(false);
this.hoAspettato = false;
}
this.riparaMacchina();
this.svuotaSacca(saccaAttrezzi);
officina.riponiMacchinaRiparata(vetturaDaRiparare);
lavori++;
this.ScriviStatistiche();
}
else {
this.hoAspettato = true;
officina.setopInAttesa(true);
}
}

public void ScriviStatistiche() {
if ((GeneratoreDiGuasti.timer.getElapsedTime()%20)==0 &&(lavori != lavori+1) ){
GeneratoreDiGuasti.timer.scriviTempoTot(); }
}





}




package com.officina;

import java.util.ArrayList;
import com.simulazione.Main;

public class CassettaAttrezzi{
private ArrayList attrezzi;
static long TempoAtt;
private int z =1;
private ArrayList attrezzicheck;
static long AttMAX =0;
static long blocco=1;
boolean trovato;
public CassettaAttrezzi(){
this.attrezzi = new ArrayList();

}

public synchronized boolean guardainCassetta(Macchina m, Guasto guasto) throws Exception{
attrezzicheck = new ArrayList();
guasto = m.analizzaMacchina();
for(int i = 0; i < guasto.decidiAttrezzi().length; i++){
String nomeAttrezzo = guasto.decidiAttrezzi()[i];
attrezzicheck.add(nomeAttrezzo);
}
return this.disponibilita(attrezzicheck);
}

public synchronized void prendiAttrezzi(ArrayList Attrezzicheck, ArrayList SaccaOperaio) throws Exception{

for(int i = 0; i < Attrezzicheck.size(); i++){
String nomeAttrezzo = (String)Attrezzicheck.get(i);
SaccaOperaio.add(this.prendiAttrezzo(nomeAttrezzo));}
Attrezzicheck.clear();
}


public synchronized Attrezzo prendiAttrezzo(String nome) throws InterruptedException{
StopWatch timerAttesa= new StopWatch();
Main.log.writeDBG("Ho bisogno dell'attrezzo <" + nome + ">");
Attrezzo attrRet = null;
while(attrRet == null){
for (int i = 0; i < attrezzi.size(); i++){
Attrezzo attrezzo = (Attrezzo) attrezzi.get(i);
if (attrezzo.equals(nome)){
attrRet = (Attrezzo)attrezzi.remove(i);
Main.log.writeDBG("Recuperato attrezzo <" + attrRet.getName() + ">");
break;
}
}
if (attrRet == null){
timerAttesa.start();
Main.log.writeDBG("IN ATTESAAAAAAAA DELL ' ATTREZZO <" + nome + ">");
blocco++;

wait();
timerAttesa.stop();
TempoAtt+= timerAttesa.getElapsedTime();
if (timerAttesa.getElapsedTime()>AttMAX)
AttMAX=timerAttesa.getElapsedTime();
}
}
return attrRet;
}

public synchronized void riponiAttrezzo(Attrezzo attrezzo){
Main.log.writeDBG("Rilascio attrezzo <" + attrezzo.getName() + ">");
attrezzi.add(attrezzo);
notify();
}


public synchronized boolean disponibilita (ArrayList listaAttrezzicheck) throws InterruptedException {


for (int i =0;i<listaAttrezzicheck.size();i++)
{
String attrezzocheck = (String)listaAttrezzicheck.get(i);
boolean trovato = false;


for (int j=0; (!trovato) && j< attrezzi.size() ;j++)
{
Attrezzo attrezzocass = (Attrezzo) attrezzi.get(j);
if (attrezzocass.equals(attrezzocheck)) trovato = true;
}
if (!trovato) {
Main.log.writeDBG("NO PUEDO TRABAHAR");
wait();

return false ;
}

}
Main.log.writeINF ( " VEDO gli attrezzi in Cassetta --> lavoro n° " +z++); //
return true;
}

public ArrayList prendiAttrezzicheck(){
return attrezzicheck;
}

}

franksisca
21-04-2006, 21:27
guarda, se posti i sorgenti e ognuno li apre con il proprio editor è meglio, quindi fall, comunque l'errore è che fai la chiamata al metodo che tu hai spostato, quindi ho fai un "command", o fai un reindirizzamento del metodo.

raniero
22-04-2006, 03:46
ecco i link ai file:

file originali:

Operaio.java (http://digilander.libero.it/rik23/Operaio.java)

CassettaAttrezzi.java (http://digilander.libero.it/rik23/CassettaAttrezzi.java)

file modificati:

Operaio(miemod).java (http://digilander.libero.it/rik23/Operaio(miemod).java)

CassettaAttrezzi(mod).java (http://digilander.libero.it/rik23/CassettaAttrezzi(miemod).java)


Grazie per l'interessamento. :)