空白的最终字段INITIAL可能尚未初始化

时间:2014-11-14 17:19:10

标签: java eclipse final

我正在用Java编程。 我已经为每个方法添加了注释来解释他们应该做什么(根据作业)。我已将我所知道的内容添加到Password.java(我在研究学校提供的javadoc之后创建的)存根中。 我的问题不是关于几个函数,我知道testWord和setWord中有错误,但我会自己处理。 我的问题是关于这一行:

public static final java.lang.String INITIAL;

这一行是由学校提供的,所以我必须假设它是正确的,我无法找到关于常量字段值INITIAL的任何文档,所以如果有人能提供我的信息那将是惊人的(例如。如何处理?它存储什么?如果有的话?键入?)。 我在Eclipse中的这一行也遇到了错误:

空白的最终字段INITIAL可能尚未初始化

为什么会出现此错误? 提前感谢您的评论。

FYI来自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;
    }
}
}

3 个答案:

答案 0 :(得分:21)

错误正是编译器所说的错误 - 你已经有了一个最终字段,但没有设置它。

需要将最终字段分配给完全一次。你根本没有分配它。我们不知道该字段在文档之外的代表意味着什么("标准初始密码") - 可能有一些您想知道的默认密码。您应该将该值分配给该字段,例如

public static final String INITIAL = "defaultpassword";

另外:你不需要写java.lang.String;只需使用短名称(String)。在代码中使用完全限定名称很少是一个好主意;只需导入您正在使用的类型,并注意java.lang中的所有内容都会自动导入。

另外:don't compare strings using ==; use .equals instead

此外:任何时候你都有这样的代码:

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

你可以写:

return condition;

例如,您的acceptable方法可以写为:

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

答案 1 :(得分:0)

您根本不会为常量变量赋值,因为常量变量需要分配一次

public static final java.lang.String INITIAL;

更改为

例如:

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

将变量声明为常量

  

在声明变量时,我表明很容易为a赋值   int变量:

     

int numberOfHoursInADay = 24; 我们知道这个价值永远不会   改变现实世界,以确保它不在程序中。   这是通过添加关键字修饰符final:

来完成的      

final int NUMBER_OF_HOURS_IN_A_DAY = 24;

     

除了最后的关键字,你应该注意到这个案例   根据标准,变量名称已更改为大写   Java命名约定。这使得更容易发现哪个   变量是代码中的常量。

     

如果我们现在尝试更改NUMBER_OF_HOURS_IN_A_DAY的值:

     

final int NUMBER_OF_HOURS_IN_A_DAY = 24; NUMBER_OF_HOURS_IN_A_DAY =   36;我们将从编译器中得到以下错误:

     

无法为最终变量NUMBER_OF_HOURS_IN_A_DAY分配值   任何其他原始数据类型变量都是如此。要做   将它们添加到常量只需将最终关键字添加到其声明中。

Source and Read More

另一个错误

if(test == INITIAL){

您必须使用equals() 比较两个字符串

<强>为什么

equals()比较您正在寻找的内容

==比较引用是否引用查看相同的位置

答案 2 :(得分:0)

我没有在提供的Password.java中看到静态最终INITIAL被分配的任何地方。这一定是问题所在。