2014-11-14 19 views
7

Ich programmiere in Java. Ich habe jeder Methode Kommentare hinzugefügt, um zu erklären, was sie tun sollen (entsprechend der Aufgabe). Ich habe hinzugefügt, was ich weiß, um den Stub von Password.java (die ich nach der Untersuchung eines Javadoc von der Schule zur Verfügung gestellt erstellt). Meine Frage bezieht sich nicht auf mehrere Funktionen, ich weiß, dass es in testWord und setWord Fehler gibt, aber ich werde das selbst behandeln. Meine Frage zu dieser Linie ist:Das leere letzte Feld INITIAL wurde möglicherweise nicht initialisiert

public static final java.lang.String INITIAL; 

Diese Linie von der Schule zur Verfügung gestellt, so ich muss davon ausgehen, dass es richtig ist, kann ich nicht alle Unterlagen überall über den konstanten Feldwert Anfangs finden, also wenn jemand bieten könnte mir mit Infos dazu wäre das erstaunlich (; zB wie wird umgegangen? was speichert es? wenn überhaupt? tippen?). auch immer Im einen Fehler auf dieser Linie in Eclipse:

Der Rohling letzte Feld INITIAL kann

initialisiert wurde nicht

Warum ist dieser Fehler hier? Vielen Dank im Voraus über die Kommentare.

FYI der Code von Password.java:

package ss.week1; 

public class Password extends java.lang.Object { 

// ------------------ Instance variables ---------------- 

/** 
* The standard initial password. 
*/ 

public static final java.lang.String INITIAL; 

// ------------------ Constructor ------------------------ 

/** 
* Constructs a Password with the initial word provided in INITIAL. 
*/ 

public Password() { 

} 

/** 
* Tests if a given string is an acceptable password. Not acceptable: A word 
* with less than 6 characters or a word that contains a space. 
* 
* @param suggestion 
* @return true If suggestion is acceptable 
*/ 

// ------------------ Queries -------------------------- 

public boolean acceptable(java.lang.String suggestion) { 
    if (suggestion.length() >= 6 && !suggestion.contains(" ")) { 
     return true; 
    } else { 
     return false; 
    } 
} 

/** 
* Tests if a given word is equal to the current password. 
* 
* @param test Word that should be tested 
* @return true If test is equal to the current password 
*/ 

public boolean testWord(java.lang.String test) { 
    if (test == INITIAL) { 
     return true; 
    } else { 
     return false; 
    } 
} 

/** 
* Changes this password. 
* 
* @param oldpass The current password 
* @param newpass The new password 
* @return true if oldpass is equal to the current password and that newpass is an acceptable password 
*/ 

public boolean setWord(java.lang.String oldpass, java.lang.String newpass) { 
    if (testWord(oldpass) && acceptable(newpass)) { 
     return true; 
    } else { 
     return false; 
    } 
} 
} 
+0

Sie müssen nicht den vollständigen Pfad für Klassen in 'java.lang' eingeben. z.B. 'public static final String INITIAL' ist vollkommen in Ordnung (und bevorzugt). –

+0

so hat es unsere Schule uns gegeben, ich dachte, das sei einfacher, aber hey, was weiß ich;) danke für deinen Kommentar. – Koen

Antwort

14

Der Fehler ist genau das, was der Compiler sagt, es ist - Sie ein letztes Feld haben, aber es ist nichts zu setzen.

Endgültige Felder müssen genau einmal zugewiesen werden. Du weist es überhaupt nicht zu. Wir wissen nicht, was das Feld außerhalb der Dokumentation darstellen soll ("Das Standard-Initialpasswort") - vermutlich gibt es ein Standardpasswort, das Sie kennen sollten. Sie sollten diesen Wert dem Feld z.

public static final String INITIAL = "defaultpassword"; 

Zusätzlich: Sie müssen nicht java.lang.String schreiben; Verwenden Sie einfach den Kurznamen (String). Es ist sehr selten eine gute Idee, vollständig qualifizierte Namen in Ihrem Code zu verwenden. Importieren Sie nur die von Ihnen verwendeten Typen und beachten Sie, dass alles in java.lang automatisch importiert wird.

Zusätzlich: don't compare strings using ==; use .equals instead.

Zusätzlich: jedes Mal, wenn der Code wie folgt haben:

if (condition) { 
    return true; 
} else { 
    return false; 
} 

Sie können einfach schreiben:

return condition; 

Zum Beispiel Ihre acceptable Methode kann wie folgt geschrieben werden:

public boolean acceptable(String suggestion) { 
    return suggestion.length() >= 6 && !suggestion.contains(" "); 
} 
+0

Danke, das sollte mich beginnen, ich werde alle oben genannten implementieren, alle sind hilfreich und für meine Fähigkeitsstufe, sehr nett, nochmals vielen Dank! 1 Frage bleibt, kann ich die setWord-Methode verwenden? Es sollte das Kennwort, das die öffentliche statische endgültige Zeichenfolge INITIAL ist, auf ein Kennwort festlegen, das dieser Methode zugewiesen wird. – Koen

+0

@Koen Sobald Ihre letzte Variable initialisiert ist, kann ihr Wert nicht geändert werden. Wenn Sie also 'INITIAL = 'gesetzt haben, können Sie einen neuen Wert nicht später zu' INITIAL' neu zuweisen. Sie sollten erwägen, "INITIAL" einen Standardwert zu haben und dann einen regulären (nicht finalen) String zu haben, der den aktuell eingestellten Wert enthält, der anfänglich 'INITIAL' ist, aber später auf einen anderen Wert geändert werden kann 'setWord' oder eine andere Methode. –

+0

Ich habe es herausgefunden, danke! Implementiert wie folgt: \t public static final java.lang.String INITIAL = "Initial"; \t private String wachtwoord; \t öffentliches Passwort() { \t \t Wachtwoord = AUSGANG; \t} – Koen

0

Sie geben Ihrer konstanten Variablen überhaupt keinen Wert, da die konstante Variable n eeds zugewiesen werden, sobald

public static final java.lang.String INITIAL; 

Änderung

Zum Beispiel:

public static final java.lang.String INITIAL ="initial"; 

eine Variable als Konstante

In Deklarieren von Variablen Deklarieren zeigte ich, dass es einfach um einer int-Variable einen Wert zuzuweisen:

int nummerOfHoursInADay = 24; Wir wissen, dieser Wert geht nie zu Änderung in der realen Welt, so dass wir sicherstellen, dass es nicht im Programm ist. Dies wird durch Hinzufügen des Keyword-Modifikator final getan wird:

final int NUMBER_OF_HOURS_IN_A_DAY = 24;

Neben dem abschließenden Schlüsselwort, das Sie, dass der Fall der Variablennamen gemäß dem Standard Java-Namenskonvention zu Großbuchstaben geändert bemerkt haben sollte. Dies macht es viel einfacher zu erkennen, welche Variablen Konstanten in Ihrem Code sind.

Wenn wir jetzt versuchen, den Wert von NUMBER_OF_HOURS_IN_A_DAY zu ändern:

final int NUMBER_OF_HOURS_IN_A_DAY = 24; NUMBER_OF_HOURS_IN_A_DAY = 36; wir erhalten den folgenden Fehler vom Compiler:

kann der letzten Variablen keinen Wert zuweisen NUMBER_OF_HOURS_IN_A_DAY Die Gleiches gilt für alle anderen primitiven Datentypenvariablen. Um sie in Konstanten zu machen, fügen Sie einfach das endgültige Schlüsselwort zu ihrer Deklaration hinzu.

Source and Read More

Ein weiterer Fehler:

if (Test == INITIAL) {

Sie equals() zu vergleichen zwei Strings

warum verwenden müssen?

equals() vergleichen againts den Inhalt, das, was Sie für

== vergleichen die Referenz suchen, wenn Referenzen an derselben Stelle

+0

Vielen Dank, sehr klar und sehr hilfreich! – Koen

0

ich nicht in dem vorgesehenen Password.java sieht überall suchen, wo die statische final INITIAL wird zugewiesen. Das muss hier das Problem sein.

Verwandte Themen