java - FindBugs插件Eclipse发现的错误

标签 java eclipse findbugs spotbugs

使用bug finder插件,我发现了这个bug,但是不明白为什么在代码中将其视为bug。有人知道这些并给我适当的解释吗?谢谢。

源代码-https://drive.google.com/open?id=1gAyHFcdHBShV-9oC5G7GeOtCGf7bXoso;

Patient.java:17 Patient.generatePriority()使用Random的nextDouble方法生成一个随机整数;使用nextInt效率更高[关注点(18),正常置信度]

 public int generatePriority(){
    Random random = new Random();
    int n = 5;
    return (int)(random.nextDouble()*n);
 }


ExaminationRoom.java:25:ExaminationRoom定义了等于并使用Object.hashCode()[Of Concern(16),正常可信度]

public boolean equals(ExaminationRoom room){
        if (this.getWaitingPatients().size() == room.getWaitingPatients().size()){
            return true;
        }
        else {
            return false;
        }
    }


ExaminationRoom.java:15:ExaminationRoom定义了compareTo(ExaminationRoom)并使用Object.equals()[Of Concern(16),正常可信度]

    // Compares sizes of waiting lists
    @Override
    public int compareTo(ExaminationRoom o) {
        if (this.getWaitingPatients().size() > o.getWaitingPatients().size()){
            return 1;
        }
        else if (this.getWaitingPatients().size() < o.getWaitingPatients().size()){
            return -1;
        }
        return 0;
    }


Hospital.java:41不良月份值12传递给Hospital.initializeHospital()中的新java.util.GregorianCalendar(int,int,int)[Scary(7),正常可信度]

    doctors.add(new Doctor("Hermione", "Granger", new GregorianCalendar(1988, 12, 10), Specialty.PSY, room102));


Person.java:29 Person.getFullName()中忽略的String.toLowerCase()返回值[Scariest(3),高置信度]

public String getFullName(){
    firstName.toLowerCase();
    Character.toUpperCase(firstName.charAt(0));
    lastName.toLowerCase();
    Character.toUpperCase(lastName.charAt(0));
    return firstName + " " + lastName;

}

最佳答案

关于“错误查找器”工具,要记住的第一件事是它们通常仅是准则。照这样说:

GregorianCalendar从0开始计数月份,表示0是1月,11是12月。 12表示不存在的第13个月。由于该函数需要一个int,并且您给了它一个int,因此即使肯定是一个错误,也不会生成编译器错误。本文很好地解释了升级的原因,并提供了有关如何使用新API的示例:https://www.baeldung.com/java-8-date-time-intro

如有疑问,您可以随时检查文档。在这种情况下,类Calendar(扩展为GregorianCalendar)会用一个静态常量public static final int JANUARY = 0;表示。这确认一月的确是0,但也表明我们可以在代码中使用此常量。您可能会发现new GregorianCalendar(1988, Calendar.JANUARY, 10)更具可读性。

您可能还需要考虑切换到用于处理时间的更现代的标准系统。 Java 8 Time库是“新标准”,绝对值得研究。

其次,String在Java中是不可变的。这意味着一旦创建了String,就永远不能更改其值。这可能与您的直觉相反,因为您可能已经看到以下代码:

String s = "hello";
s = s + " world";


但是,这不会修改字符串s。相反,s + " world"创建一个新的String,并将其分配给变量s

同样,s.toLowerCase()不会更改s是什么,它只会生成必须分配的新String

您可能想要firstName = firstName.toLowerCase();

在您的第一个示例中,没有什么立即让我感到“不好”,但是如果您查看工具生成的消息,它们会将第一个示例标记为“关注的”,而将其他示例标记为(例如string.toLowerCase()示例) )作为“可怕” /“可怕”。尽管我对这个工具不是特别熟悉,但是我认为这表明更多的是“代码气味”,而不是实际的错误。

如果您想确保自己的代码可以工作,也许可以考虑使用单元测试。

关于java - FindBugs插件Eclipse发现的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59915845/

相关文章:

security - 有没有类似于 Fortify 的开源软件?

java - 可以在静态方法中调用非静态方法吗?

java - 无法在我的另一台电脑上运行相同的 servlet/hibernate 项目

java - 通过组织导入,Eclipse 使用什么来决定非指定包的导入顺序?

java - 参数化工厂方法模式

java - WorkbenchPage.openEditor() 不执行任何操作

java - TeamCity 构建中没有代码检查选项卡 (FindBugs)

c - 有什么工具可以捕捉 C 代码中的愚蠢错误?

java - P 作为泛型中的占位符

java - 在 Java 中捕获 Throwable 的最佳实践