2014-11-14 15 views
7

Sto programmando in Java. Ho aggiunto commenti ad ogni metodo per spiegare cosa dovrebbero fare (in base al compito). Ho aggiunto quello che so allo stub di Password.java (che ho creato dopo aver ricercato un javadoc fornito dalla scuola). La mia domanda non riguarda diverse funzioni, so che ci sono errori in testWord e setWord, ma me ne occuperò io stesso. La mia domanda è su questa linea:Il campo finale vuoto INITIAL potrebbe non essere stato inizializzato

public static final java.lang.String INITIAL; 

Questa linea è fornito dalla scuola, così io devo supporre che sia corretto, non posso trovare alcuna documentazione ovunque sulla costante INIZIALE valore del campo, quindi se qualcuno potrebbe fornire me con informazioni su quello che sarebbe fantastico (ad esempio come viene gestito? cosa memorizza? se qualcosa? tipo?). anche Im ottenendo un errore su questa linea in Eclipse:

l'iniziale campo finale vuoto potrebbe non essere stata inizializzata

Perché questo errore qui? Grazie in anticipo per i commenti.

FYI il codice 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

Non è necessario digitare il percorso completo per le classi in 'java.lang'. per esempio. 'String finale statico pubblico INITIAL' è perfettamente a posto (e preferito). –

+0

ecco come la nostra scuola ci ha dato, ho pensato che fosse più facile ma hey, cosa ne so;) grazie per il tuo commento. – Koen

risposta

14

L'errore è esattamente ciò che il compilatore dice che è - hai un campo finale, ma l'impostazione non è.

I campi finali devono essere assegnati a esattamente una volta. Non ti stai assegnando affatto. Non sappiamo cosa il campo intende rappresentare oltre la documentazione ("La password iniziale standard") - presumibilmente ci sono alcune password predefinite che dovresti conoscere. Dovresti assegnare quel valore al campo, ad es.

public static final String INITIAL = "defaultpassword"; 

Inoltre: non è necessario scrivere java.lang.String; basta usare il nome breve (String). Raramente è una buona idea usare nomi completi nel tuo codice; importa solo i tipi che stai utilizzando e ricorda che tutto in java.lang viene importato automaticamente.

In aggiunta: don't compare strings using ==; use .equals instead.

Inoltre: ogni volta che si dispone di codice in questo modo:

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

si può semplicemente scrivere:

return condition; 

Ad esempio, il metodo di acceptable può essere scritta come:

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

grazie, che dovrebbe farmi iniziare, implementerò tutto quanto sopra, tutti sono utili e per il mio livello di abilità, molto bello, grazie ancora! Rimane 1 domanda, posso usare il metodo setWord? dovrebbe impostare la password, che è la stringa finale statica pubblica INITIAL, su una password data a questo metodo. – Koen

+0

@Koen Una volta inizializzata la variabile finale, il suo valore non può essere modificato. Quindi, una volta impostato 'INITIAL = ', non è più possibile riassegnare un nuovo valore a 'INITIAL'. Puoi prendere in considerazione il fatto che 'INITIAL' mantiene un valore predefinito, e quindi avere una stringa regolare (non finale) con il valore attualmente impostato, che è' INITIAL' per cominciare, ma può essere cambiato in un altro valore in seguito su 'setWord' o un altro metodo. –

+0

L'ho capito, grazie! Implementato in questo modo: \t public static final java.lang.String INITIAL = "Iniziale"; \t private String wachtwoord; \t password pubblico() { \t \t wachtwoord = INIZIALE; \t} – Koen

0

Non si assegna mai alcun valore alla variabile costante perché la variabile costante n eeds da assegnare una volta

public static final java.lang.String INITIAL; 

modifica

Ad esempio:

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

dichiarazione di una variabile come costante

In variabili dichiarando ho mostrato che è facile per assegnare un valore a una variabile int :

int numberOfHoursInADay = 24; Sappiamo che questo valore non sta andando a cambiamento nel mondo reale, così ci assicuriamo che non sia nel programma. Questo viene fatto aggiungendo la parola chiave modificatore di finale:

final int NUMBER_OF_HOURS_IN_A_DAY = 24;

Oltre alla parola finale Avrete anche notato che il caso del nome della variabile è cambiato da maiuscolo alla norma Java convenzione di denominazione. Ciò rende molto più facile individuare quali variabili sono costanti nel codice.

Se ora cerchiamo di cambiare il valore di NUMBER_OF_HOURS_IN_A_DAY:

final int NUMBER_OF_HOURS_IN_A_DAY = 24; NUMBER_OF_HOURS_IN_A_DAY = 36; otterremo il seguente errore dal compilatore:

non può assegnare un valore alla variabile finale NUMBER_OF_HOURS_IN_A_DAY Lo vale per qualsiasi altra variabile di tipo di dati primitivi. Per convertire in costanti basta aggiungere la parola chiave finale alla loro dichiarazione.

Source and Read More

Un altro errore:

se (test == INIZIALE) {

È necessario utilizzare equals() per confrontare due stringhe

perché?

equals() confrontare againts il contenuto che quello che stai cercando per

== confrontare il riferimento se i riferimenti sono alla ricerca nella stessa posizione

+0

Grazie mille, molto chiaro e molto utile! – Koen

0

non vedo in qualsiasi parte del previsto Password.java dove la statica è stato assegnato l'INITIAL finale. Questo deve essere il problema qui.

Problemi correlati