我编写了一个员工类,它有一个显示方法和构造函数。
public class employee {
public int empid;
public String name;
public employee(int id, String name){
empid = id;
this.name = name;
}
public void display (){
System.out.println("Employee id: " +empid +"\nEmployee name: "+name);
}
}
然后我创建了三个employee对象并将它们存储在主类的数组中。我创建了一个if块,用于检查用户猜测并打印员工详细信息(如果存在),或者如果数据不存在则抛出异常。 if块被包含在一个增强的for循环中,循环遍历数组。
public static void main(String[] args) {
// TODO code application logic here
employee priya = new employee (001, "Priya");
employee tamizh = new employee (002, "Tamizh");
employee hari = new employee (003, "hari");
employee[] list = new employee[3];
list[0] = priya;
list[1] = tamizh;
list[2] = hari;
int userGuess = 002;
for (employee l : list){
if (userGuess == l.empid)
{
l.display();
break;
}
else
{
throw new InputMismatchException ("employee doesnot exist");
}
}
}
}
麻烦的是,即使猜测正确,程序也会抛出异常。我尝试了int变量empid,然后是String变量名,但是==和.equals都没有用。我搜索了stackoverflow,建议的解决方案是覆盖employee类中的hashcode和equals方法。我做到了。
public class employee {
public int empid;
public String name;
public employee(int id, String name){
empid = id;
this.name = name;
}
public void display (){
System.out.println("Employee id: " +empid +"\nEmployee name: "+name);
}
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + empid;
result = prime * result + name.hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
employee other = (employee) obj;
if (this.empid != other.empid)
return false;
if (this.name.equals(other.name))
return false;
return true;
}
}
现在当我将输入作为001时,代码工作正常。但是对于任何其他输入(包括现有的empids 002和003),都会抛出异常。
在压倒一切中我做错了什么?另外,我不理解我编写的代码来覆盖这两种方法。有人可以解释逻辑和错误的地方吗?感谢。
编辑:谢谢你们。我已经意识到我在for循环中的错误并且我编辑了它。它现在完美无缺。
int userGuess = 002;
boolean found = false;
for (employee l : list){
if (userGuess == l.empid)
{
l.display();
found = true;
break;
}
}
if(found == false){
try{
throw new InputMismatchException ("employee doesnot exist");
}
catch(InputMismatchException e){
System.out.println("Employee doesnot exist.");
}
}
非常感谢你们。有人可以解释我在equals和hashcode方法中所做的事情吗?我从答案中复制了代码,但我无法找到解释。再次感谢。
答案 0 :(得分:1)
从第一个条目开始迭代整个数组。 因此,如果您将第一个条目与您的用户输入(比如说它的002)进行比较,则该语句将为false。所以它会引发异常。
要解决此问题,您必须检查是否找到了一个条目 AFTER 迭代您的数组。
int userGuess = 002;
boolean userFound = false;
for (employee l : list)
{
if (userGuess == l.empid)
{
userFound = true;
l.display();
break;
}
}
if(!userFound)
{
throw new InputMismatchException ("employee doesnot exist");
}
回答你的第二个问题:
我认为你不需要equals()和hashCode()方法。
equals检查两个对象是否相同(参见https://msdn.microsoft.com/de-de/library/bsc2ak47(v=vs.110).aspx)
hashCode()方法生成一个" unique"对象的值(参见https://msdn.microsoft.com/de-de/library/system.object.gethashcode(v=vs.110).aspx)
答案 1 :(得分:0)
这应该适合你:
boolean found = false;
for (employee l : list){
if (userGuess == l.empid) {
l.display();
found = true;
break;
}
}
if(!found){
throw new InputMismatchException ("employee doesnot exist");
}
您现有的代码无效,因为循环中的第一个代码始终为001
。