2012-12-05 2 views
-2

난 당신이 전체 코드를 읽을 것으로 예상니까. IDE에 복사하여 붙여 넣으면 문제를 찾아야합니다. 저는 Java에 익숙하지 않습니다.이 코드는이 생성자 문제로 인해 시간을 많이 먹고 있습니다. 모든 코드의 모든 잘 작동하지만, 객체뭔가 내 생성자에 문제가 있습니다 - ToString는 반환 유지 널

public class TestContact { 

public static void main(String[] args) { 

    // Juiste invoer begins with 0 and 9 digits 
    Phone vasteTel1 = new Phone("027261747", "FIX"); 
    // wrong fix phone 
    Phone vasteTel2 = new Phone("27261447", "FIX"); 

    // Juiste invoer begins with 0 and 10 digits 
    Phone mobieleTel1 = new Phone("0495556080", "MOBIELE"); 
    // // wrong mobile phone 
    Phone mobieleTel2 = new Phone("10495557841", "MOBIELE"); 

    Contact contact1 = new Contact("Joske Ergens", "mobiele", 
      "[email protected]", "0495558041"); 
    Contact contact2 = new Contact("Joseline Peremans", "mobiele", 
      "[email protected]", "024596247"); 

    System.out.println("NUMMER " + vasteTel1.getNummer() + "\nSOORT: " 
      + vasteTel1.getSoort() + "\nGELDIG NUMMER ?: " 
      + vasteTel1.isGeldigNummer() + "\n"); 
    System.out.println("NUMMER " + vasteTel2.getNummer() + "\nSOORT: " 
      + vasteTel2.getSoort() + "\nGELDIG NUMMER ?:" 
      + vasteTel2.isGeldigNummer() + "\n"); 
    System.out.println("NUMMER " + mobieleTel1.getNummer() + "\nSOORT: " 
      + mobieleTel1.getSoort() + "\nGELDIG NUMMER ?: " 
      + mobieleTel1.isGeldigNummer() + "\n"); 
    System.out.println("NUMMER " + mobieleTel2.getNummer() + "\nSOORT: " 
      + mobieleTel2.getSoort() + "\nGELDIG NUMMER ?: " 
      + mobieleTel2.isGeldigNummer() + "\n"); 

    System.out.println(contact2); 

} 

}

공용 클래스 연락이 ContactGegevens {

ContactGegevens gegevens; 
String naam; 

public Contact() { 

} 

public Contact(String naam, String soort, String mail, String nummer) { 
    this.naam = naam; 
    gegevens = new ContactGegevens(getNummer(), getSoort(), getEmail()); 

} 

public void toonInfo() { 

} 

public String toString() { 
    return "NAAM: " + naam + "|\n" + gegevens.getNummer(); 
} 

}

공용 클래스 ContactGegevens 확장을 확장의 문자열 reprsentation을 반환 나던 전화 {

private String eMail; 
private Phone gsm; 
private Phone telefoon; 

public ContactGegevens() { 

} 

public ContactGegevens(String nummer, String soort, String email) { 
    super(nummer, soort); 
    this.eMail = email; 
    gsm = new Phone(getNummer(), getSoort()); 
    telefoon = new Phone(getNummer(), getSoort()); 

} 

public String getEmail() { 
    return eMail; 

} 

public Phone getGsm() { 
    return gsm; 

} 

public Phone getTelefoon() { 
    return telefoon; 
} 

public String toString() { 
    // return email adress vast foon, gsm 
    return "" + eMail + " " + gsm; 
} 

}

공용 클래스 전화 {

private static final int LENGTE_MOBIEL = 10; 
private static final int LENGTEVAST = 9; 

private String nummer; 
private String soort; 

public Phone() { 

} 

public Phone(String nummer, String soort) { 
    this.nummer = nummer; 
    this.soort = soort; 
} 

public String getNummer() { 

    return nummer; 
} 

public String getSoort() { 

    return soort; 
} 

public boolean isGeldigNummer() { 
    if ((nummer.startsWith(nummer, 0) && nummer.length() == LENGTE_MOBIEL)) 
     return true; 
    else if ((nummer.startsWith(nummer, 0) && nummer.length() == LENGTEVAST)) 
     return true; 

    else 
     return false; 
} 

}

+0

안녕하세요. 안녕하세요. 문제는 생성자의 어딘가에 있습니다. 전체 코드를 읽지 마십시오.고마워요 –

+0

디버깅을 시도 했습니까? – Kai

+0

그런 다음 어떻게 되나요? – RNJ

답변

1

버그가 실제로 여기에 있습니다 :

public Contact(String naam, String soort, String mail, String nummer) { 
    this.naam = naam; 
    gegevens = new ContactGegevens(getNummer(), getSoort(), getEmail()); 
} 

하기는 냈 새로운 ContactGegevens으로 객체를 설정하고 그 필드가 설정되어 있지 않은 모든 널 (null)을 반환합니다 개체의 게터를 호출하고 있습니다. 다음과 같이 적응 : 또한, 당신은 확장과 같은 클래스를 작성할

public Contact(String naam, String soort, String mail, String nummer) { 
    this.naam = naam; 
    gegevens = new ContactGegevens(nummer, soort, mail); 
} 

, 일부 객체 지향 책에서 봐 주시기 바랍니다 ... 당신이해야

가. ContactGegevens 클래스를 확장하고 super (...) 생성자를 호출하고 필드로 만들지 마십시오. b. ContactGegevens를 지금하고있는 것처럼 필드로 만들어서 Contact와 ContactGegevens를 구성하거나 확장하지 마십시오.

+0

와우, 이미 좋아 보인다. 내가 너에게 연락하려고 노력할거야 –

+0

Wondefull. 나는 객체 오리엔테이션 책으로 돌아갈 것이다. –

1

당신이 클래스를 확장 할 경우 해당 클래스의 인스턴스를 생성하지 않습니다. 대신 super()으로 전화해야합니다. 예를 들어 :

public class Contact extends ContactGegevens { 
    public Contact(String naam, String soort, String mail, String nummer) { 
     super(nummer, soort, email); 
     this.naam = naam; 
    } 
} 

ContactGegevens에서 당신은 Phone 클래스를 확장합니다. 괜찮아요.하지만 두 개의 다른 전화 번호를 저장하려고합니다. 필요하지 않은이 경우 그래서,/Phone을 확장해야합니다. 당신이 이미하고있는 그러나, 2 개 Phone 객체를 인스턴스화 : 당신은 단지 하나 개의 전화 번호가 필요한 경우, 당신은 extend Phone 부분을 유지하고 gsmtelefoon 필드 (및 인스턴스화를) 제거 할 수 있습니다

public class ContactGegevens { 
    public ContactGegevens(String nummer, String soort, String email) { 
     super(nummer, soort); 
     this.eMail = email; 
     gsm = new Phone(getNummer(), getSoort()); 
     telefoon = new Phone(getNummer(), getSoort()); 
    } 
} 

. Contact와 유사합니다.

또한 콘텐츠가없는 기본 생성자 ContactGegevens()도 포함합니다. 클래스의 인스턴스가 생성되지 않은/초기화되지 않은 필드가 있기 때문에 응용 프로그램이 손상 될 수 있습니다. 그래서 당신은 그들을 remvoe하거나 필드에 대한 기본값을 제공해야합니다.

+0

이미 시도했지만 두 클래스의 Tostring 메서드를 호출 할 때 여전히 null을 반환합니다. –

+0

'시도'할 필요가 없습니다. * 변경해야합니다. * 이! 그렇지 않으면 응용 프로그램/데이터 모델이 다른 모든 관련 항목을 포함하여 제대로 작동하지 않습니다. 예제를주의 깊게 읽으면,'super()'호출은 제공된 생성자 인자를 직접 사용합니다. 이것은 매우 중요합니다! – Veger

+0

노력해 주셔서 감사합니다. 많이 불만을 품은 –