Java (Array)List denkfehler?

kellerlanplayer

www.Blog2Help.com
ID: 10624
L
29 April 2006
2.280
247
Hallo,

ich möchte quasi eine 1:n Beziehung abbilden.
Ein Versuch kann mehrere Prüflinge haben.

Wenn Prüflinge vorhanden sind, sollen die bei den Versuchen angezeigt werden. Ich arbeite mit dem GWT-Framework:

Hier mal die relevanten Klassen:

Versuch:
Code:
public class Versuch implements Serializable {

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Projekt projekt;
	private double Laufzeit;
	private String Versuchsnummer;
	
	private String Pruefmedium;
	private Zyklus zyklus;
	private String Versuchsanmerkung;
	private String Bearbeiter;
	private String Befunder;
	
	private Date Datum;
	private List<Pruefling> prueflingsContainer = new ArrayList<Pruefling>();
	
	//public Versuch(){}
	
	
	public List<Pruefling> getPrueflingsContainer() {
		return prueflingsContainer;
	}
	public void addPrueflingsContainer(Pruefling pruefling) {
		prueflingsContainer.add(pruefling);
	}
	public Date getDatum() {
		return Datum;
	}
	public void setDatum(Date datum) {
		Datum = datum;
	}
	public String getVersuchsnummer() {
		return Versuchsnummer;
	}
	public void setVersuchsnummer(String versuchsnummer) {
		Versuchsnummer = versuchsnummer;
	}
	
	public Projekt getProjekt() {
		return projekt;
	}
	public void setProjekt(Projekt projekt) {
		this.projekt = projekt;
	}
	public double getLaufzeit() {
		return Laufzeit;
	}
	public void setLaufzeit(double laufzeit) {
		Laufzeit = laufzeit;
	}
	public String getPruefmedium() {
		return Pruefmedium;
	}
	public void setPruefmedium(String pruefmedium) {
		Pruefmedium = pruefmedium;
	}
	
	public Zyklus getZyklus() {
		return zyklus;
	}
	public void setZyklus(Zyklus zyklus) {
		this.zyklus = zyklus;
	}
	public String getVersuchsanmerkung() {
		return Versuchsanmerkung;
	}
	public void setVersuchsanmerkung(String versuchsanmerkung) {
		Versuchsanmerkung = versuchsanmerkung;
	}
	public String getBearbeiter() {
		return Bearbeiter;
	}
	public void setBearbeiter(String bearbeiter) {
		Bearbeiter = bearbeiter;
	}
	public String getBefunder() {
		return Befunder;
	}
	public void setBefunder(String befunder) {
		Befunder = befunder;
	}
	
	
}


VersuchScreen:
Code:
package de.ddb.client;

import java.util.ArrayList;

public class VersuchScreen extends Composite {

	private HauptfunktionenServiceAsync haupt = GWT.create(HauptfunktionenService.class);
	final FlexTable flexTable = new FlexTable();
	final ListBox comboBox_2 = new ListBox();
	final ListBox comboBox = new ListBox();
	final Label erfolgLabel = new Label("New label");
	final DatePicker datePicker = new DatePicker();
	final ListBox comboBoxPruefmedium = new ListBox();
	final ListBox comboBox_1 = new ListBox();
	final TextArea textArea = new TextArea();
	final TextBox textBox_1 = new TextBox();
	final DoubleBox doubleBox = new DoubleBox();
	private List<Projekt> projektContainer = new ArrayList<Projekt>();
	final TextBox textBox = new TextBox();
		
	public VersuchScreen(Versuch versuch) {
		
		RootPanel.get("obenHauptfenster").clear();
		RootPanel.get("Hauptfenster").clear();
		RootPanel.get("rechteNavi").clear();  
		RootPanel.get("rechteNavi").add(new VersucheAnzeigen());
		VerticalPanel verticalPanel = new VerticalPanel();
		verticalPanel.setBorderWidth(0);
		initWidget(verticalPanel);
		verticalPanel.add(flexTable);
		
		Label lblProjektAuswhlen = new Label("Projekt auswaehlen");
		flexTable.setWidget(0, 0, lblProjektAuswhlen);
		
		flexTable.setWidget(0, 1, comboBox);
		
		Label lblProjektnummer = new Label("Versuchsnummer");
		flexTable.setWidget(1, 0, lblProjektnummer);
		
		
		flexTable.setWidget(1, 1, textBox);
		
		Label lblVersuchsstart = new Label("Versuchsstart");
		flexTable.setWidget(2, 0, lblVersuchsstart);
		Label lblNewLabel = new Label("Laufzeit");
		flexTable.setWidget(3, 0, lblNewLabel);
		flexTable.setWidget(3, 1, doubleBox);
		Label lblNewLabel_1 = new Label("Versuchsanmerkung");
		flexTable.setWidget(4, 0, lblNewLabel_1);
		
		
		flexTable.setWidget(4, 1, textArea);
		textArea.setSize("176px", "89px");
		
		Label lblVersuchsingenieur = new Label("Bearbeiter");
		flexTable.setWidget(5, 0, lblVersuchsingenieur);
		
		
		flexTable.setWidget(5, 1, comboBox_1);
		
		
		
		Label lblBefunder = new Label("Befunder");
		flexTable.setWidget(6, 0, lblBefunder);
		flexTable.setWidget(6, 1, comboBox_2);
		
		Label lblPruefmedium = new Label("Pruefmedium");
		flexTable.setWidget(7, 0, lblPruefmedium);
		
		
		flexTable.setWidget(7, 1, comboBoxPruefmedium);
		
		flexTable.setWidget(9, 1, erfolgLabel);
		erfolgLabel.setVisible(false);
		
		//Überprüfen ob neuer Versuch oder vorhandener Versuch
		
		if (versuch != null) {
			showPrueflinge(versuch);
			vorhandendenVersuchAnzeigen(versuch.getProjekt(), versuch.getLaufzeit(),  versuch.getVersuchsnummer(), versuch.getPruefmedium(),  versuch.getVersuchsanmerkung(),  versuch.getBearbeiter(), versuch.getBefunder(), versuch.getDatum());
		} else {
		
			doubleBox.addChangeHandler(new ChangeHandler() {
				public void onChange(ChangeEvent event) {
					
					if (FieldVerifier.isDoubleZahl(doubleBox.getText()) == false) {
						doubleBox.setText("Bitte ganzzahligen Wert eingeben");
					}
				}
			});
			
			//Projekte in ComboboxEinlesen
			projektContainer = ProjekteAnzeigenComboBox();
			
			
			textBox_1.setText("Klicken fuer Kalender");
			flexTable.setWidget(2, 1, textBox_1);
			
			textBox_1.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					
					datePicker.addHighlightHandler(new HighlightHandler<Date>() {
						public void onHighlight(HighlightEvent<Date> event) {
							textBox_1.setText("Datum auswaehlen");
							textBox_1.setText(String.valueOf(datePicker.getValue()));
							textBox_1.setEnabled(false);
						}
					});
					
					flexTable.setWidget(2, 2, datePicker);
				}
			});	
		
		//Bearbeiter comboBox füllen
		comboBox_1.addItem("Christian Fuchs");
		comboBox_1.addItem("Daniel Paul");
		comboBox_1.addItem("Karsten Stenzel");
		comboBox_1.addItem("Matthias Weber");
		comboBox_1.addItem("Peter Endl");
		//Pruefmedium comboBox füllen
		comboBoxPruefmedium.addItem("Gasoline");
		comboBoxPruefmedium.addItem("Diesel");
		comboBoxPruefmedium.addItem("Worst-Case-Diesel");
		
		//Befunder comboBox füllen
		comboBox_2.addItem("Andreas Ulig");
		comboBox_2.addItem("Armin Mauerer");
		comboBox_2.addItem("Rene Saffer");
		
		final Button btnSpeichern = new Button("Speichern");
		btnSpeichern.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				//Versuch speichern
				
				btnSpeichern.setVisible(false);
				
				if (FieldVerifier.isValidName(textBox.getText())) {
					
					AsyncCallback<Void> callback = new AsyncCallback<Void>() {

						@Override
						public void onFailure(Throwable caught) {
							
							erfolgLabel.setText("Fehler" + caught.getMessage());
							erfolgLabel.setVisible(true);
						}

						@Override
						public void onSuccess(Void result) {
							
							erfolgLabel.setText("Erfolgreich gespeichert");
							erfolgLabel.setVisible(true);
							
							RootPanel.get("rechteNavi").clear();
							RootPanel.get("rechteNavi").add(new VersucheAnzeigen());
							
							Button btnNeuesProjektErstellen = new Button("Neuen Versuch erstellen");
							btnNeuesProjektErstellen.addClickHandler(new ClickHandler() {
								public void onClick(ClickEvent event) {
									RootPanel.get("Hauptfenster").add(new VersuchScreen(null));
								}
							});
							flexTable.setWidget(10, 1, btnNeuesProjektErstellen);
							btnNeuesProjektErstellen.setWidth("209px");
							flexTable.getCellFormatter().setHorizontalAlignment(3, 1, HasHorizontalAlignment.ALIGN_CENTER);
							
						}
					};
					
					haupt.versuchAnlegen(projektContainer.get(comboBox.getSelectedIndex()), datePicker.getValue(), textBox.getValue(), doubleBox.getValue(), comboBoxPruefmedium.getItemText(comboBoxPruefmedium.getSelectedIndex()), textArea.getValue(), comboBox_1.getItemText(comboBox_1.getSelectedIndex()), comboBox_2.getItemText(comboBox_2.getSelectedIndex()), callback);
					
					
					} else {
											
						erfolgLabel.setText("Bitte gueltige Versuchsnummer angeben");
							erfolgLabel.setVisible(true);	
						
				}
			}
			
				
			
		});
		flexTable.setWidget(8, 1, btnSpeichern);
		btnSpeichern.setWidth("115px");
		flexTable.getCellFormatter().setHorizontalAlignment(8, 1, HasHorizontalAlignment.ALIGN_RIGHT);
		
		
	}
	}	
		
	
	public void ComboboxVersucheFuellen() {
		
				
				//textBox_2.setText(String.valueOf(ProjekteAnzeigenComboBox().));
				if (projektContainer.isEmpty()) {
					comboBox.addItem("Keine Projekte angelegt");
				} else {
				for (int i=0; i < projektContainer.size(); i++) {
					comboBox.addItem(projektContainer.get(i).getProjektnummer());
				}
				
				
				
				}
			
	}

	public List<Projekt> ProjekteAnzeigenComboBox() {
		
		final List<Projekt> projekte = new ArrayList<Projekt>();
		
		if (haupt == null) {
			haupt = GWT.create(HauptfunktionenService.class);
		}
			
		AsyncCallback<List<Projekt>> callback = new AsyncCallback<List<Projekt>>() {
						
				
				public void onFailure(Throwable caught) {
					
				}

				public void onSuccess(List<Projekt> result) {
				
						for (Projekt projekt : result) {
							projekte.add(projekt);						
						}
						
						ComboboxVersucheFuellen();
					}
				};
			
			haupt.projekteAnzeigen(callback);
			
			return projekte;
	}
	
	
public void showPrueflinge(Versuch versuch) {
		
	RootPanel.get("obenHauptfenster").add(new PrueflingeAnzeigen(versuch));  
	
  }


public void vorhandendenVersuchAnzeigen (Projekt projekt, double laufzeit, String versuchsnummer, String pruefmedium, String versuchsanmerkung, String bearbeiter, String befunder, Date datum) {
	
	comboBox.addItem(projekt.getProjektnummer());
	comboBox_1.addItem(bearbeiter);
	comboBox_2.addItem(befunder);
	comboBoxPruefmedium.addItem(pruefmedium);
	textBox_1.setText(String.valueOf(datum.getDate()));
	textArea.setText(versuchsanmerkung);
	textBox.setText(versuchsnummer);
	doubleBox.setValue(laufzeit);
	
}
	
}

Wie man sehen kann, wird hier ein Versuch objekt übergeben, wenn verfügbar und übergibt das der PrueflingeAnzeigen - Klasse:

Code:
RootPanel.get("obenHauptfenster").add(new PrueflingeAnzeigen(versuch));


PrueflingeAnzeigen:
Code:
public class PrueflingeAnzeigen extends Composite{ 
	
	private HauptfunktionenServiceAsync projektSvc = GWT.create(HauptfunktionenService.class);
	protected FlexTable flexTable = new FlexTable();
	private List<Pruefling> projektContainer = new ArrayList<Pruefling>();
	final List<Pruefling> prueflinge = new ArrayList<Pruefling>();
	
	public PrueflingeAnzeigen (Versuch versuch) {
		
			
		final VerticalPanel verticalPanel = new VerticalPanel();
		verticalPanel.setBorderWidth(0);
		initWidget(verticalPanel);
		verticalPanel.setSize("93px", "314px");
		verticalPanel.add(flexTable);
		
		//verticalPanel.add(flexTable);
		projektContainer = getPrueflinge(versuch);
		//getPrueflinge(versuch);
		
		
	}
		
	public List<Pruefling> getPrueflinge(Versuch versuch) {
		
		
		if (versuch == null) {
		
		final List<Pruefling> prueflinge = new ArrayList<Pruefling>();
		
		if (projektSvc == null) {
			projektSvc = GWT.create(HauptfunktionenService.class);
		}
			
		AsyncCallback<List<Pruefling>> callback = new AsyncCallback<List<Pruefling>>() {
						
				
				public void onFailure(Throwable caught) {
					
					return;
				}

				public void onSuccess(List<Pruefling> result) {
				
					if(result == null || result.size() == 0) {
						Label lblKeineProjekteVorhanden = new Label("Keine Prueflinge vorhanden1");
						flexTable.setWidget(1, 0, lblKeineProjekteVorhanden);
						
						return;
					} else {
					
						for (Pruefling projekt : result) {
							prueflinge.add(projekt);						
						}
						
						showPrueflinge();
					}
				}
				
			};
			
			projektSvc.prueflingeAnzeigen(callback);
			
			return prueflinge;
			
		} else {
			
			
			
			
			if (projektSvc == null) {
				projektSvc = GWT.create(HauptfunktionenService.class);
			}
				
			AsyncCallback<List<Pruefling>> callback = new AsyncCallback<List<Pruefling>>() {
							
					
					public void onFailure(Throwable caught) {
						
						return;
					}

					public void onSuccess(List<Pruefling> result) {
					
						if(result == null || result.size() == 0) {
							Label lblKeineProjekteVorhanden = new Label("Keine Prueflinge vorhanden2");
							flexTable.setWidget(1, 0, lblKeineProjekteVorhanden);
							
							return;
						} else {
						
							for (Pruefling projekt : result) {
								prueflinge.add(projekt);						
							}
							
							showPrueflinge();
						}
					}
					
				};
				
				projektSvc.prueflingeAnzeigen(versuch, callback);
				
				return prueflinge;
			
			}
		}
		
		

public void showPrueflinge() {
	
	Label lblVorhandene = new Label("Vorhandene Prueflinge");
	flexTable.setWidget(0, 0, lblVorhandene);
	
		
	for (int i=0; i < projektContainer.size(); i++) {
	

		
	Button btnNewButton = new Button(projektContainer.get(i).getPrueflingsnummer());
	btnNewButton.addClickHandler(new ClickHandler() {
	public void onClick(ClickEvent event) {
			
		//RootPanel.get("Hauptfenster").add(new ProjektScreen(nummer, beschreibung));
	}
	});
	flexTable.setWidget(i+1, 0, btnNewButton);
	
	}

  }

}

Wenn ein Versuch übergeben wurde, springt er automatisch in Zeile 71 und holt sich dort aus der HauptfunktionenServiceImpl die Versuche durch die Funktion projektSvc.prueflingeAnzeigen(versuch, callback);

HauptfunktionenServiceImpl
Code:
public class HauptfunktionenServiceImpl extends RemoteServiceServlet implements HauptfunktionenService {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	
	List<Versuch> versuche = new ArrayList<Versuch>();
	List<Projekt> projekte = new ArrayList<Projekt>();
	List<Zyklus> zyklen = new ArrayList<Zyklus>();
	List<Pruefling> prueflinge = new ArrayList<Pruefling>();
	List<Pruefling> prueflingTemp = new ArrayList<Pruefling>();
	
	
	
	public void versuchAnlegen(Projekt projekt, Date datum, String versuchsnummer, double laufzeit,
			String pruefmedium, String versuchsanmerkung, String bearbeiter,
			String befunder) {

		Versuch versuch = new Versuch();
		versuch.setVersuchsnummer(versuchsnummer);
		versuch.setProjekt(projekt);
		versuch.setLaufzeit(laufzeit);
		versuch.setPruefmedium(pruefmedium);
		versuch.setVersuchsanmerkung(versuchsanmerkung);
		versuch.setBearbeiter(bearbeiter);
		versuch.setBefunder(befunder);
		versuch.setDatum(datum);
		versuche.add(versuch);
		
	}

	@Override
	public List<Versuch> versucheAnzeigen(Projekt projekt) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Versuch> versucheAnzeigen() {
		
		return versuche;
	}

	@Override
	public void zyklusAnlegen(String name) {
		
		Zyklus zyklus = new Zyklus();
		zyklus.setBezeichnung(name);
		zyklen.add(zyklus);
		
		
	}

	@Override
	public List<Zyklus> zyklenAnzeigen() {
		
		return  zyklen;
	}

	@Override
	public void prueflingAnlegen(Versuch versuch, String nummer) {

		Pruefling pruefling = new Pruefling();
		pruefling.setPrueflingsnummer(nummer);
		prueflinge.add(pruefling);
		prueflingZuordnen(versuch, pruefling);
		
	}

	
	public void prueflingZuordnen(Versuch versuch, Pruefling pruefling){
		
		versuch.addPrueflingsContainer(pruefling);
	}
	
	@Override
	public List<Pruefling> prueflingeAnzeigen(Versuch versuch) {
		
			return versuch.getPrueflingsContainer();
	}

	@Override
	public List<Pruefling> prueflingeAnzeigen() {
		
		return prueflinge;
	}

	@Override
	public void projektAnlegen(String beschreibung, String projektnummer) {

		Projekt projekt = new Projekt();
		projekt.setProjektnummer(projektnummer);
		projekt.setProjektBeschreibung(beschreibung);
		projekte.add(projekt);
		
	}

	@Override
	public List<Projekt> projekteAnzeigen() {
		
		return projekte;
	}

	

	
}

Also noch einmal zusammengefasst, wenn ich ein Prüfling anlege, muss ich einen Versuch auswählen, den er zugeordnet wird, der addet eigentlich in dem Versuchsobjekt in der Liste den Prüfling und wenn ich den Versuch anzeigen will, soll er mir die zugeordneten Prüflinge in der Liste ausspucken. Das funzt aber nicht und ich finde den fehler nicht. Er schmeißt mir immer nur ne Fehlermeldung, dass die Liste leer ist ...

Ich hoffe es ist einigermaßen verständlich und ihr könnt mir auf die Sprünge helfen ...
 
Wenn der Debugger sagt, es wird eine leere Liste zurückgegeben, dann wurde kein Element hinzugefügt!

Code:
versuch.setDatum(datum);
versuche.add(versuch);

nur ein tippfehler ???
 
Wenn der Debugger sagt, es wird eine leere Liste zurückgegeben, dann wurde kein Element hinzugefügt!

Code:
versuch.setDatum(datum);
versuche.add(versuch);

nur ein tippfehler ???

nein?

Also nach einer weiteren Stunde Fehlerbehebung liegt es wohl daran, dass die Liste nicht mehr aktuell ist, wenn ein Prüfling hinzugefügt wurde. Aber ganz hab ich ihn noch nicht :-/

Scheint doch nicht so trivial zu sein, wie ich dachte
 
Also nach einer weiteren Stunde Fehlerbehebung liegt es wohl daran, dass die Liste nicht mehr aktuell ist, wenn ein Prüfling hinzugefügt wurde. Aber ganz hab ich ihn noch nicht :-/

Was meinst du mit "Liste nicht mehr aktuell"?
Und hast du mal mittels Debugger überprüft ob vom Server denn die Prüflinge wirklich zurückgegeben werden? Nicht das von dort eine leere Liste kommt?
Bzw. welches ist denn genau die Zeile von der die Exception kommt, dass die Liste leer ist?
 
Ja, es kommt eine leere Liste zurück.

Also ein Fehler war, dass ich ja die Liste in der HauptfunktionenImpl aktuallisieren musste, wenn ein Prüfling einem bestehenden Versuch zugeordnet wurde. Das hab ich jetzt behoben. Aber ich hab noch ein weiteres großes Problem. Meine Objekte werden einfach nicht übergeben.

€: Vergesst den Rest, hab den Fehler gefunden und es lag nicht am leeren Objekt, sondern am Datum und ich hab die Fehlermeldung falsch gelesen ... sry
 
Zuletzt bearbeitet:
prima, wenn es so einfach war...
aber beim nächsten mal kannst du die gesamte fehlermeldung (exception) posten. meist steht ja eine zeilennummer bei oder auch ein objekt, um das es geht. Damit läßt sich dann leichter debuggen...

Dennoch gut das dualles allein hinbekommen hast