使用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/