Datenübergabe von ArrayList

koddy013

Mitglied
Hallo,

ich habe eine Problem beim Datenübergabe von ArrayList.


Die ArrayList habe ich durch eine Scanner eingefüllt. Die Scanner-Methode habe ich hier nicht gelistet. Also die Klasse von den ArrayList ist folgendes:
Java:
public class MSPoints {

    private double z;
    private double y;
    private double f;

    public MSPoints(){
    }

    public MSPoints(double y){
        this.y = y;
    }

    public MSPoints(double y, double f){
        this.y = y;
        this.f = f;
    }

    public MSPoints(double z, double y, double f){
        this.z = z;
        this.y = y;
        this.f = f;
    }

    public double getZ() {
        return  z;
    }

    public double getY() {
        return  y;
    }

    public double getF() {
        return  f;
    }
}

Java:
public class MSProfile {

    private int points;
    private List<MSPoints> mspoints = new ArrayList<MSPoints> ();
    public List<MSPoints> mspoints_y = new ArrayList<MSPoints> ();
    public List<MSPoints> mspoints_f = new ArrayList<MSPoints> ();

    public MSProfile(){
    }

    public void setPoints(int value){
        points = value;
    }

    private int getPoints() {
        return points;
    }

    public List<MSPoints> getMSPoints(){
        return mspoints;
    }

    public List<MSPoints> getYMSPoints(){
        return mspoints_y;
    }

    public List<MSPoints> getFMSPoints(){
        return mspoints_f;
    }

    public void addMSPoints(double y){
        mspoints_y.add(new MSPoints(y));
    }

    public void addMSPoints(double y, double f){
        mspoints_f.add(new MSPoints(f));
    }

    public void addMSPoints(MSPoints s){
        mspoints.add(s);
    }
 }

Dann jetzt möchte ich die Liste von mspoints_y und mspoints_f in folgendes Klasse übergeben.
Java:
public class Reg_Line_DataModel {
    int M = 10;

    // Rufen List
    List<MSPoints> list_y = new ArrayList<MSPoints>();
    List<MSPoints> list_f = new ArrayList<MSPoints>();

    // Umwandeln in Array
    Double[] X = (Double[]) list_y.toArray(new Double[M+1]);
    Double[] F = list_f.toArray(new Double[M+1]);

    Reg_Line_DataModel() {
        list_y = msDataModel.getMSProfile().mspoints_y;
        list_f = msDataModel.getMSProfile().mspoints_f;
    }
}

Aber leider ist die Daten nicht übertragen geworden. Die list_y und list_f ist zeigt immer null.

Kann jemand mir helfen, wie kann ich diese Liste von den vorherigen list ausfüllen?

Danke im voraus für jede Hilfe.

Liebe Grüße,
 
Hallo,

auf die Reg_Line_DataModel ist eigentlich diese Zeile gegeben:
private MSDataModel msDataModel;

ich habe nicht alle Code hier kopiert, weil sonst die Code zu lang ist :)

Und hier ist noch die Class MSDataModel
Java:
public class MSDataModel {
    private MSPoints mspoints;
    private MSProfile msProfile;

    public MSDataModel() {
        mspoints = new MSPoints();
        msProfile = new MSProfile();
    }

    protected MSPoints getMSPoints()
    {
        return  mspoints;
    }

    protected MSProfile getMSProfile()
    {
        return  msProfile;
    }
}

Wenn ich die Methode aufrüfen, kommt folgende Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Grüße,
 
Hier ist die komplete Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Reg_Line_DataModel.<init>(Reg_Line_DataModel.java:41)
at Controller$RegLineListener.actionPerformed(Controller.java:403)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6216)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5981)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


Also die erste Fehlermeldung bezogen sich auf diese Zeile:
Code:
        list_y = msDataModel.getMSProfile().mspoints_y;

Und die zweite bezogen sich auf diese Zeile:
Code:
    // RegLine test
    private class RegLineListener implements ActionListener {
        public void actionPerformed(ActionEvent evt)
        {
        Reg_Line_DataModel   model = new Reg_Line_DataModel();
        Reg_Line          reg_line = new Reg_Line(model);
        }
    }

Grüße
 
Hallo,

auf die Reg_Line_DataModel ist eigentlich diese Zeile gegeben:
private MSDataModel msDataModel;

Hier müsste der Fehler liegen. Du legst zwar eine Variable an, aber diese wird nicht initialisiert. Also das msDataModel ist null.

Gruß

Sascha
 
Hier müsste der Fehler liegen. Du legst zwar eine Variable an, aber diese wird nicht initialisiert. Also das msDataModel ist null.

Gruß

Sascha

genau... an der Stelle habe ich Fehler gemacht. Also habe ich die Klasse geändert.

Java:
    Reg_Line_DataModel(MSDataModel msDataModel) {
        this.msDataModel = msDataModel;

        list_y = msDataModel.getMSProfile().mspoints_y;
        list_f = msDataModel.getMSProfile().mspoints_f;
}

Jetzt zeigt aber die Liste immer "null" an.
Ich glaube, ich habe noch die Fehler beim einfüllen von Liste.

Danke aber für die Hilfe :)
 
Zuletzt bearbeitet von einem Moderator:
Hi

Lad uns doch mal ein Archiv mit dem ganzen Code hoch falls der nicht zu groß ist. Dann ist es irgendwie einfacher zum debuggen.
 
Also... hier ist die Klasse von MSDataModel:

Java:
public class MSDataModel {

    private  String  strOriginalTXTData;

    private static final String STAR = "*";
    private static final String FLANK = "FLANK: ";
    private static final String TOOTH = "TOOTH: ";
    private static final String PROFILE = "PROFILE: ";
    private static final String POINTS = "POINTS: ";

    private Map<String, MSFlank> flanks = new HashMap<String, MSFlank>();

    private MSPoints mspoints;
    private MSProfile msProfile;

    public MSDataModel() {
        mspoints = new MSPoints();
        msProfile = new MSProfile();
    }

    protected MSPoints getMSPoints()
    {
        return  mspoints;
    }

    protected MSProfile getMSProfile()
    {
        return  msProfile;
    }

    public Map<String, MSFlank> getMSFlank(){
        return flanks;
    }

    public void addMSFlank(MSFlank f, String flank){
        flanks.put(flank, f);
    }

    protected void  doReadInputFile(String inputTXTFile) throws Exception
    {
        BufferedReader  bufReader = null;
		try {
			bufReader = new BufferedReader(new FileReader(inputTXTFile));
			strOriginalTXTData = new String();
			String  lineString;
			while ((lineString = bufReader.readLine()) != null)
            {
                if (lineString.trim().equals("")) continue;           // Leerzeile

                if (lineString.trim().startsWith(STAR)) continue;     // Zeile anfangen mit *

                if (lineString.startsWith(FLANK))                     // Flank zeile
                {
                    String flank = parseFlank(lineString);
                    MSFlank f = null;

                    if (flanks.containsKey(flank))
                    {
                        f = flanks.get(flank);
                    }
                    else
                    {
                        f = new MSFlank(flank);
                    }
                    flanks.put(flank, f);

                    // Tooth zeile
                    lineString = bufReader.readLine();
                    if (!lineString.startsWith(TOOTH))
                    {
                        throw new NumberFormatException("nach Flank muss Tooth kommen, es kam: " + lineString);
                    }
                    String toothStr = parseTooth(lineString);
                    MSTooth t = new MSTooth(toothStr);
                    f.addMSTooth(t);

                    // Profile zeile
                    lineString = bufReader.readLine();
                    if (!lineString.startsWith(PROFILE))
                    {
                        throw new NumberFormatException("nach Tooth muss Profile kommen, es kam: " + lineString);
                    }
                    String profileStr = parseProfile(lineString);
                    MSProfile pf = new MSProfile(profileStr);
                    t.addMSProfile(pf);

                    // Points zeile
                    lineString = bufReader.readLine();
                    if (!lineString.startsWith(POINTS))
                    {
                        throw new NumberFormatException("nach Profile muss Points kommen, es kam: " + lineString);
                    }
                    int lAnz = parsePoint(lineString);
                    for (int i = 0; i < lAnz; i++)
                    {
                        // Doublezeile
                        lineString = bufReader.readLine();
                        pf.addMSPoints(parsePoints(lineString));
                    }
                }
            }
		}
        catch (FileNotFoundException ex) {
            throw new  Exception("Input file can not found: " + ex.getMessage());
		}
        catch (SecurityException ex) {
			throw new  Exception("Disobey the security of input file: " + ex.getMessage());
		}
        catch (IOException ex) {
            throw new  Exception("Process error: " + ex.getMessage());
		}
        finally {
            if (bufReader != null) {
                bufReader.close();
            }
        }
    }

    protected String parseFlank(String aFlank) {
        int e = aFlank.indexOf(";");
		return aFlank.substring(0, e).trim();
    }

    protected String parseTooth(String aTooth){
        String[] result = aTooth.split("[:;]");
        return result[1].trim();
    }

    protected String parseProfile(String aProfile){
		StringTokenizer tokenizer = new StringTokenizer(aProfile, " ");
		tokenizer.nextToken();
		return tokenizer.nextToken().toString();
    }

    protected int parsePoint(String aPoint) {
        String[] result = aPoint.split("[:;]");
        return Integer.parseInt(result[1].trim());
    }

    protected MSPoints parsePoints(String aPoints) {
		StringTokenizer t = new StringTokenizer(aPoints, " ");
		t.nextToken();
		double z = Double.valueOf(t.nextToken());
		double y = Double.valueOf(t.nextToken());
		double f = Double.valueOf(t.nextToken());
		return new MSPoints(z, y, f);
    }

    protected void doFillDataModel (String inputTXTFile){
        Set<String> keySet = flanks.keySet();
		for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();)
        {
			String flank = (String) iterator.next();
			MSFlank f = flanks.get(flank);
			System.out.println(f);
        }
    }

}

Die Ausgabe davon ist folgendes:

Code:
MSFlank: [FLANK: RIGHT]
MSTooth: [Tooth:1]
MSProfile: [1]
[z:36.2], [y:172.2], [f:9.2]
[z:36.2], [y:172.095], [f:8.9]
[z:36.2], [y:171.99], [f:8.1]
[z:36.2], [y:171.885], [f:7.8]
[z:36.2], [y:171.78], [f:7.5]
MSTooth: [Tooth:1]
MSProfile: [2]
[z:35.166], [y:172.2], [f:81.7]
[z:35.166], [y:172.095], [f:109.9]
[z:35.166], [y:171.99], [f:130.9]
[z:35.166], [y:171.885], [f:143.0]
[z:35.166], [y:171.78], [f:149.3]
[z:35.166], [y:171.675], [f:154.4]

Nun werde ich nur die y und f werte erstmal benutzen, deswegen muss ich in der Liste separieren.
 
Hallo...

Ich habe meine Code noch mal nachgeschaut, und jetzt weiss ich, wieso habe ich kein Daten in diesen Liste.
Beim Einlesen von Daten wird die List "mspoints" eingefüllt. Also in diese mspoints erhält die double z, double y, double f.
Jetzt habe ich eigentlich zwei Möglichkeiten, um nur die z, y, f - Werte zu bekommen.
Die erste Möglichkeit ist durch Änderung von die Einfüllung von List, also anstatt in "mspoints"-List, fülle ich direkt zu verschiedene Liste.
Die andere Möglichkeit ist durch Trennung von die "mspoints" -List zu drei verschiedene Liste.

Da vielleicht besteht die Möglichkeit, die "mspoints"-List später weiter zu verwenden, werde ich die zweite Möglichkeit nehmen.
Also... ist es möglich aus ein ListArray mit 3 Werte zu 3 verschiedene List zu wandeln?

Oder muss ich die Wandlung zu normale 3-dimensionale-Array erstmal einführen, also z.B. nach Double[ ][ ][ ] mspoints_Array = mspoints.toArray(new Double(mspoints.size());?
Dann wandele ich die 3-d-Array in 1-d-Array.
 
Zurück