Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

1

06.09.2012, 17:43

Eigenes Objekt in Liste einfügen ergibt Fehler

Guten Abend zusammen.

Kaum ist der eine Fehler behoben, tut sich schon der Nächste auf:

Ich habe eine eigene Klasse (Listen), die als Membervariablen eine Liste vom Typ Fach (eigene Klasse), sowie eine Liste vom Typ Color (ebenfalls eigene Klasse) hat.
Ganz am Anfang versuche ich eine Instanz der Klasse Listen zu erstellen und in die Liste vom Typ Color gleich mal ein Color-Objekt ein zu fügen, was allerdings die App abstürzen lässt.
Dank BlueCobold habe ich nun das Plugin FindBug und kann euch eine Fehlermeldung dazu liefern:

Bug: Read of unwritten public or protected field farben in
de.xorstudios.youplan.YouPlanActivity.Init()

The program is dereferencing a public or protected field that does not seem
to ever have a non-null value written to it. Unless the field is initialized via
some mechanism not seen by the analysis, dereferencing this value will generate
a null pointer exception.

Confidence: Normal, Rank: Troubling (14)
Pattern:
NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD
Type: NP, Category:
STYLE (Dodgy code)

Dieser Fehler befindet sich in Zeile 12 in YouPlanActivity.


Hier noch meine Klassen:
CodeSchnippsel von YouPlanActivity:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    //#####################################################################
    // Initialisierung ####################################################
    //#####################################################################
    
    private void Init() {
        
        //Liste für fächer und farben der fächer einmalig anlegen
        if(!memory.contains("DATA")) {
            
            Listen data = new Listen();
            Color farbe = new Color("rot", 123);
            data.farben.add(farbe);
            
            storeMyData("DATA", data);
        }

Fach:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Fach implements Serializable {
    
    protected String name;
    protected String abkuerzung;
    protected String lehrer;
    protected Color farbe;
    
    protected float schulaufgabe_gewichtung;
    protected float ex_gewichtung;
    protected float muendlich_gewichtung;
    
    protected List<Integer> schulaufgaben_note;
    protected List<Integer> ex_note;
    protected List<Integer> muendlich_note;
    
    public Fach(String name, String abkuerzung,
                String lehrer, Color farbe) {
        
        this.name = name;
        this.abkuerzung = abkuerzung;
        this.lehrer = lehrer;
        this.farbe = farbe;
        
        this.schulaufgabe_gewichtung = 2.0f;
        this.ex_gewichtung = 1.0f;
        this.muendlich_gewichtung = 0.5f;
    }

}

Color:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
public class Color implements Serializable {

    protected String colorName;
    protected int colorCode;
    
    
    public Color(String colorName, int colorCode) {
        
        this.colorName = colorName;
        this.colorCode = colorCode;
    }
}



Listen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class Listen implements Serializable{

    protected List<Fach> faecher;
    protected List<Color> farben;
    
    protected int getColorCode(String colorName) {
        
        if(!farben.isEmpty()) {
            
            for(int counter = 0; counter < farben.size(); counter++) {
                
                if(farben.get(counter).colorName == colorName)
                    return farben.get(counter).colorCode;
            }
        }
        
        return 0;
    }
    
    
    protected String getColorName(int colorCode) {
        
        if(!farben.isEmpty()) {
            
            for(int counter = 0; counter < farben.size(); counter++) {
                
                if(farben.get(counter).colorCode == colorCode)
                    return farben.get(counter).colorName;
            }
        }
        
        return null;
    }
    
    
    protected boolean containsColor(String colorName) {
        
        if(!farben.isEmpty()) {
            
            for(int counter = 0; counter < farben.size(); counter++) {
                
                if(farben.get(counter).colorName == colorName)
                    return true;
            }
        }
        
        return false;
    }
    
    
    protected boolean containsfach(String fachName) {
        
        if(!faecher.isEmpty()) {
            
            for(int counter = 0; counter < faecher.size(); counter++) {
                
                if(faecher.get(counter).name == fachName)
                    return true;
            }
        }
        
        return false;
    }
}



Ich hoffe Ihr könnt mir wieder einmal weiterhelfen und mir somit sagen wiso er dort eine Fehlermeldung ausgibt bzw. die App abstürtzt. :-)
Dankeschön bereits im Voraus,


mfG XoR

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »XoR« (06.09.2012, 17:50)


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

06.09.2012, 17:46

Die Klasse "Listen" wäre noch nett.

EDIT:

Naja, die Fehlermeldung sagt schon alles.

Du hast das Array "farben" als protected deklariert und willst jetzt von außen darauf zugreifen. Protected Member sind jedoch nur für die Klasse selbst und von ihr abgeleitetete Klassen sichtbar (Bei Java glaub ich noch für Klassen im selben package, bin mir da aber nicht sicher).
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nimelrian« (06.09.2012, 17:54)


XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

3

06.09.2012, 18:02

Diese ganzen Klassen sind im selben package und da es sich hier Java handelt sind diese Klassen somit untereinander sichtbar, soweit ich weiß.

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

4

06.09.2012, 19:19

package scope != protected

Java-Quelltext

1
2
3
4
public class Foo  {
    protected Bar bar; // nur für diese Klasse und abgeleitete Klassen im Paket sichtbar
    Baz baz; // für alle Klassen im Paket sichtbar
}


Zudem hätte ich noch ein paar Anmerkungen, die du als konstruktive Kritik verstehen solltest:

* Die Mischung von deutschen und englischen Bezeichnern wird meist als schlechter Stil angesehen

* In java schreibt man normalerweise statt "ex_note" eigentlich "exNote" (Ich persönlich finde eigentlich auch "ex_note", bzw. "ex-note" in Lisp ähnlichen Sprachen, visuell ansprechender, aber es sieht einfach besser aus wenn in einer Sprache alle die gleiche Schreibweise verwenden.)

* Statt deiner Klasse Listen könntest du auf Maps (HashMap / TreeMap) zurückgreifen

* Statt mit einer for-Schleife kannst du mit einer foreach :D Schleife über Container iterieren

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »foreach« (06.09.2012, 23:08)


XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

5

06.09.2012, 21:38

Danke für deine Antwort foreach.
Ich werde absofort deine Tipps beherzigen, was aber das eigentliche Problem angeht, bin ich mir zu 99% sicher, dass protected auch für alle Klassen im selben package sichtbar ist. Das gleiche sagt auch Google.
Nichts desto trotz habe ich deine Variante ausprobiert, was aber den Fehler nicht komplett behob (insofern ich es richtig Gemacht habe):

Quellcode

1
2
3
4
5
6
7
public class Listen implements Serializable{

    List<Fach> faecher;
    List<Color> farben;

...
    


Fehlermeldung:

Bug: Read of unwritten field farben in
de.xorstudios.youplan.YouPlanActivity.Init()

The program is dereferencing a field that does not seem to ever have a
non-null value written to it. Unless the field is initialized via some mechanism
not seen by the analysis, dereferencing this value will generate a null pointer
exception.

Confidence: Normal, Rank: Scary ( 8 )
Pattern:
NP_UNWRITTEN_FIELD
Type: NP, Category: CORRECTNESS
(Correctness)


MfG XoR

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

6

06.09.2012, 21:51

Initialisierst du das ganze irgendwo?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

7

06.09.2012, 21:54

Bin mir nicht ganz sicher was du meinst, aber ich Habe eine Init-Funktion in YouPlanActivity (siehe den ersten Post), die einmalig ausgeführt wird.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

06.09.2012, 22:29

Ich rate dir zu einem Buch, du scheinst wichtige Begriffe nicht oder falsch zu verstehen.

Du erstellst zwar ein "Listen"-Objekt, aber du initialisierst nicht dessen Member. Du sagst einfach, dass es in "Listen" eine List "faecher" gibt, erstellen tust du sie aber nicht.

Du musst im Konstruktor mit faecher = new List<faecher> das ganze erstmal initialisieren, bevor du es nutzen kannst.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

9

07.09.2012, 01:12

Ganz hat deins auch nicht gestimmt ( faecher = new ArrayList<Fach>(); ), aber du hast mich auf den richtigen Weg gebracht, danke!
Hatte total vergessen die Membervariablen auf dem Heap zu erzeugen :-D


MfG XoR

Werbeanzeige