0

我有这个方法

public static boolean DNIRepetido(String dni1){
        boolean aux=false;

        for (Cliente cliente : cli) {
            if(dni1==cliente.dni){
                aux=true;
            }else{
                aux=false;
                break;
            }
        }
        return aux;
    }

但是当我实现它时,它不能正常工作

do{
    System.out.print("DNI: ");
    c.dni=sc.next();
}while((ValidarDNI(c.dni)==false)&&(DNIRepetido(c.dni)==false));

(“ValidarDNI”工作正常)

4

4 回答 4

2

equals()您应该通过该方法比较字符串。

if(dni1==cliente.dni){

应该

if(dni1.equals(cliente.dni)){

(您可能希望满足上述空引用)

== 运算符使用引用相等,而该equals()方法比较实际对象(即字符数组是否相同 - 它们是否相同字符串)。

请注意,==如果您使用的是直接实例化的字符串,那么这将起作用。

于 2013-06-12T08:33:55.143 回答
2

必须使用 equals 方法比较字符串是否相等(相同的内容)。这是一个常见的错误

另外,我会检查DNIRepetido退出条件。我猜你想在发现重复的 DNI 时退出。在您的情况下,如果您发现重复的 DNI (并因此设置aux = true),则 for 循环的下一次迭代将改变这一事实:

public static boolean DNIRepetido(String dni1){
        for (Cliente cliente : cli) {
            if(dni1.equals(cliente.dni)){
                return true;
            }
        }
        return false
    }
于 2013-06-12T08:39:47.457 回答
1

上下文不清楚,但

if (dni1==cliente.dni) { // is the wrong way to compare two strings

你应该break参加比赛;不是的时候

if(dni1==cliente.dni){
  aux=true;
  break; // here
} else {
  aux=false;
  // break; // not here
}

equals()改为使用(几乎总是比较对象)

if (dni1 != null && dni1.equals(cliente.getDni())) {
// this compares the actual text content; not the reference

而且,我建议您将成员字段设为私有并使用 getter 方法来访问它们。

于 2013-06-12T08:36:12.630 回答
0

只是为了在代码中添加另一个问题,除了用于比较字符串的 equals() 方法。

当您进入循环时,当您第一次找到具有不同 DNI 的客户端时,您将退出循环并且不会检查其他客户端 DNI。您应该避免代码的 else 部分:

public static boolean DNIRepetido(String dni1){
        boolean aux=false;

        for (Cliente cliente : cli) {
            if(dni1.equals(cliente.dni)){
                aux=true;
            }
        }
        return aux;
    }
于 2013-06-12T08:41:19.980 回答