我写了一个具有显示方法和构造函数的员工类。
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);
}
}
然后,我创建了三个员工的对象,并将它们存储在主类中的数组中。我创建了一个IF块,该块将检查用户猜测并打印员工详细信息,如果他的存在,或者如果不存在数据,则会引发异常。if块被封闭在循环的增强循环中。
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,然后尝试了字符串变量名称,但是==和.equals都没有起作用。我搜索了stackoverflow,建议的解决方案是覆盖员工类中的哈希码并等于方法。我做到了。
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.");
}
}
非常感谢。有人可以解释我在等式和哈希码方法中所做的事情吗?我从答案中复制了代码,但找不到解释。再次感谢。
您从第一个条目开始通过整个数组进行迭代。因此,如果将第一个条目与用户输入进行比较(假设其002),则语句将是错误的。因此,它会抛出一个例外。
要解决此问题,您必须检查是否在迭代的数组中找到了条目。
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()方法。
等于检查两个对象是否相同(请参阅https://msdn.microsoft.com/de-de/library/bbsc2ak47(v=vs.110).aspx)
)hashcode()方法为对象生成一个"唯一"值(请参阅https://msdn.microsoft.com/de-de/library/system.object.gethashcode.gethashcode(V=VS.110).aspx)
这应该对您有用:
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
。