web-dev-qa-db-fra.com

Le champ final vierge INITIAL n'a peut-être pas été initialisé

Je programme en Java. J'ai ajouté des commentaires à chaque méthode pour expliquer ce qu'ils sont censés faire (selon le devoir). J'ai ajouté ce que je sais au talon de Password.Java (que j'ai créé après avoir recherché un javadoc fourni par l'école). Ma question ne concerne pas plusieurs fonctions, je sais qu'il y a des erreurs dans testWord et setWord, mais je m'en occuperai moi-même. Ma question concerne cette ligne:

public static final Java.lang.String INITIAL;

Cette ligne est fournie par l'école, donc je dois supposer qu'elle est correcte, je ne peux pas trouver de documentation n'importe où sur la valeur de champ constante INITIAL, donc si quelqu'un pouvait me fournir des informations à ce sujet, ce serait incroyable (par exemple, comment est-il manipulé? que stocke-t-il? le cas échéant? type?) Je reçois également une erreur sur cette ligne dans Eclipse:

Le champ final vierge INITIAL n'a peut-être pas été initialisé

Pourquoi cette erreur est-elle ici? Merci d'avance pour les commentaires.

Pour info le code de 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;
    }
}
}
11
Koen

L'erreur est exactement ce que le compilateur dit - vous avez un champ final, mais rien ne le définit.

Les champs finaux doivent être attribués à exactement une fois. Vous ne vous y affectez pas du tout. Nous ne savons pas ce que le champ est censé représenter au-delà de la documentation ("Le mot de passe initial standard") - il y a probablement un mot de passe par défaut que vous êtes censé connaître. Vous devez attribuer cette valeur au champ, par exemple.

public static final String INITIAL = "defaultpassword";

De plus: vous n'avez pas besoin d'écrire Java.lang.String; utilisez simplement le nom court (String). C'est très rarement une bonne idée d'utiliser des noms complets dans votre code; importez simplement les types que vous utilisez et sachez que tout dans Java.lang est importé automatiquement.

De plus: ne comparez pas les chaînes en utilisant ==; utilisation .equals à la place .

De plus: chaque fois que vous avez un code comme celui-ci:

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

vous pouvez simplement écrire:

return condition;

Par exemple, votre méthode acceptable peut s'écrire:

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

Vous n'attribuez jamais de valeur à votre variable constante car la variable constante doit être affectée une fois

public static final Java.lang.String INITIAL;

changer pour

Par exemple:

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

Déclaration d'une variable comme constante

En déclarant des variables, j'ai montré qu'il est facile d'attribuer une valeur à une variable int:

int numberOfHoursInADay = 24; Nous savons que cette valeur ne changera jamais dans le monde réel, nous nous assurons donc que ce n'est pas le cas dans Cela se fait en ajoutant le modificateur de mot-clé final:

final int NUMBER_OF_HOURS_IN_A_DAY = 24;

En plus du mot-clé final, vous devriez avoir remarqué que la casse du nom de variable a changé pour être en majuscule selon la convention de dénomination standard Java. Cela facilite beaucoup plus la détection des variables constantes dans votre code.

Si nous essayons maintenant de modifier la valeur de NUMBER_OF_HOURS_IN_A_DAY:

final int NUMBER_OF_HOURS_IN_A_DAY = 24; NUMBER_OF_HOURS_IN_A_DAY = 36; nous obtiendrons l'erreur suivante du compilateur:

ne peut pas affecter de valeur à la variable finale NUMBER_OF_HOURS_IN_A_DAY Il en va de même pour les autres variables de type de données primitif. Pour les transformer en constantes, ajoutez simplement le mot-clé final à leur déclaration.

Source et en savoir plus

Une autre erreur :

if (test == INITIAL) {

Vous devez utiliser equals() pour comparer deux chaînes

pourquoi ?

equals() compare le contenu que vous recherchez

== Comparer la référence si les références regardent au même endroit

0
Kick Buttowski

Je ne vois nulle part dans le Password.Java fourni où l'INITIAL final statique est assigné. Ce doit être le problème ici.

0
glaze