JAVA- Null pointer exception problem.

  • JAVA- Null pointer exception problem.

    Hallo alle zusammen.^^

    Ich muss für die Schule einen emailverteiler programmieren (java) der in einem array alle E-Mailadressen speichert, und sie wieder ausgibt. Dabei soll er nicht gleiche adressen Speichern können. außerdem soll man überprüfen können ob die Adresse zulässig ist. (ein @ enthalten.)

    Ich habe grundsätzlich alles gemacht. Leider komtm bei mir in der Methode "speichere Eintrag" das null pointer exception problem.
    (in der IF Abfrage in der for schleife.)Ich habe es bei mCode unten Rot Markiert.
    Ich habe keine Ahnung wie ich das Problem lösen kann. Ich habe schon versucht das Array vorher mit einem leeren String zu belegen, aber das Pro0blem besteht wetierhin.
    Was soll ich da tun?
    Hier ist der Code:

    public class EmailVerteiler{

    private int anzEintraege;
    private String[] emailadresse;

    EmailVerteiler(int z){
    anzEintraege = 0;
    emailadresse = new String[z];
    }

    void speichereEintrag(String adresse){
    boolean pr1 = false;
    boolean pr2 = false;

    for (int i = 0;i<emailadresse.length-1;i++){
    if (emailadresse.equals(adresse)){
    pr1 = true;
    }
    if (pruefeAdresse(adresse)==true){
    pr2=true;
    }
    if (pr1 == true && pr2 ==true){
    if(anzEintraege<emailadresse.length){
    emailadresse[anzEintraege]=adresse ;
    anzEintraege++;
    }
    }
    }
    }

    boolean pruefeAdresse(String adresse){

    int PR3 = 0;
    boolean PR4 = false;
    boolean PRend = false;
    for (int a = 0;a<adresse.length();a++){
    if (adresse.charAt(a) =='@'){
    PR3 ++;
    }
    if (adresse.substring(adresse.length()-3,adresse.length()).equals(".at")){
    PR4=true;
    }
    }
    if(PR3 == 1 && PR4 == true){
    PRend = true;
    }
    return PRend;
    }

    String zeigeVerteiler(){
    String rueckgabe = "";
    for (int c = 0; c<emailadresse.length;c++){
    rueckgabe = rueckgabe+emailadresse[code=c]+ ";";
    }
    return rueckgabe;
    }

    public static void main(String args[]){
    EmailVerteiler verteiler1 = new EmailVerteiler(10);
    verteiler1.speichereEintrag("irgendwer@gmx.at");
    verteiler1.speichereEintrag("niemand@gmx.at");
    verteiler1.speichereEintrag("unbekannt@gmx.at");
    verteiler1.speichereEintrag("irgendwer@gmx.at");

    System.out.println(verteiler1.zeigeVerteiler());
    }
    }


    Wäre für Hilfe dankbar. :)
  • Das hat jetzt nichts mit dem Problem zutun, aber hier:

    Quellcode

    1. void speichereEintrag(String adresse){
    2. boolean pr1 = false;
    3. boolean pr2 = false;
    4. for (int i = 0;i<emailadresse.length-1;i++){ // wird auf true gesetzt, wenn es die Adresse schon gibt.
    5. if (emailadresse.equals(adresse)){
    6. pr1 = true;
    7. }
    8. if (pruefeAdresse(adresse)==true){
    9. pr2=true;
    10. }
    11. if (pr1 == true && pr2 ==true){ // wenn pr1 = true
    12. if(anzEintraege<emailadresse.length){
    13. emailadresse[anzEintraege]=adresse ;
    14. anzEintraege++;
    15. }
    16. }
    17. }
    18. }
    Alles anzeigen

    wird doch gespeichert, wenn die Adresse schon exsestiert, oder?

    Oh, jetzt habe ich den Fehler:
    if (emailadresse.equals(adresse)){

    wo gibst du da den Index an? es müsste
    if (emailadresse.equals(adresse)){

    heißen, oder?
    maxda
  • Ja fast, also erstens muss man wie maxda gesagt hat den Index angeben, weil du sonst das Objekt emailadresse (Typ String[]) mit dem String adresse vergleichst -> macht keinen Sinn.

    2. Die Methode speichereEintrag ist komisch. Jedenfalls ist das logische Konstrukt daneben, du willst ja nur dann einen Eintrag speichern wenn pr1 und pr2 true sind, d.h. du gehst am Anfang mal davon aus dass die beiden prüfwerte erfüllt sind und wechselst sie dann auf false wenn die adresse ein Kriterium nicht erfüllt z.B. weil sie schon in der Liste ist oder weil sie kein @ enthält.

    3. emailadresse kann null sein. Und null kennt natürlich die methode equals nicht weshalb du bei einem nicht mit leeren Strings initialisierten Array sowas machst: null.equals(adresse), und sowas macht halt auch keinen Sinn. D.h. du solltest sowas machen: adresse.equals(emailadresse), mal ausgehend davon, dass der String adresse nicht null ist.

    Ahja und deine forschleife war off by one du hattest emailadresse.length - 1, da du aber i < als diesen Wert laufen lässt, vergisst du das letzte Element.

    edit: dämliches forum hat meine einrückungen gefressen ;(

    Quellcode

    1. class MainTestClass {
    2. private int anzEintraege;
    3. private String[] emailadresse;
    4. MainTestClass(int z) {
    5. anzEintraege = 0;
    6. emailadresse = new String[z];
    7. }
    8. void speichereEintrag(String adresse) {
    9. boolean pr1 = true;
    10. boolean pr2 = true;
    11. for (int i = 0; i < emailadresse.length; i++) {
    12. if (adresse.equals(emailadresse[i])) {
    13. pr1 = false;
    14. //Falls eine emailadresse schon gefunden wurde, kann abgebrochen werden
    15. //Ausnahmsweise mal ein break, will deinen code nicht zu sehr ändern
    16. break;
    17. }
    18. }
    19. pr2 = pruefeAdresse(adresse);
    20. if (pr1 == true && pr2 == true) {
    21. if (anzEintraege < emailadresse.length) {
    22. emailadresse[anzEintraege] = adresse;
    23. anzEintraege++;
    24. }
    25. }
    26. }
    27. boolean pruefeAdresse(String adresse) {
    28. int PR3 = 0;
    29. boolean PR4 = false;
    30. boolean PRend = false;
    31. for (int a = 0; a < adresse.length(); a++) {
    32. if (adresse.charAt(a) == '@') {
    33. PR3++;
    34. }
    35. if (adresse.substring(adresse.length() - 3, adresse.length())
    36. .equals(".at")) {
    37. PR4 = true;
    38. }
    39. }
    40. if (PR3 == 1 && PR4 == true) {
    41. PRend = true;
    42. }
    43. return PRend;
    44. }
    45. String zeigeVerteiler() {
    46. String rueckgabe = "";
    47. for (int c = 0; c < emailadresse.length; c++) {
    48. rueckgabe = rueckgabe + emailadresse[code=c] + ";";
    49. }
    50. return rueckgabe;
    51. }
    52. public static void main(String args[]) {
    53. MainTestClass verteiler1 = new MainTestClass(10);
    54. verteiler1.speichereEintrag("irgendwer@gmx.at");
    55. verteiler1.speichereEintrag("niemand@gmx.at");
    56. verteiler1.speichereEintrag("unbekannt@gmx.at");
    57. verteiler1.speichereEintrag("irgendwer@gmx.at");
    58. System.out.println(verteiler1.zeigeVerteiler());
    59. }
    60. }
    Alles anzeigen
  • Oh, jetzt habe ich den Fehler:
    if (emailadresse.equals(adresse)){

    wo gibst du da den Index an? es müsste
    if (emailadresse.equals(adresse)){

    heißen, oder?
    maxda


    Verstehe ich nicht....

    1. Diese beiden anweisungen sind identisch,
    2. Wo genau hast du die if anweisung gefunden? Ich habe blos eine in meinem Script stehen:
    if (emailadresse[i].equals(adresse)){

    /Edit:
    Hmmm... Wie genau mache ich das, dass das ganze array nicht null ist?
    Bei mir kommt jetzt zwar kein error, aber es wird immer "null;" ausgegeben...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • LEWA schrieb:

    Hmmm... Wie genau mache ich das, dass das ganze array nicht null ist?
    Bei mir kommt jetzt zwar kein error, aber es wird immer "null;" ausgegeben...
    Du machst einfach ne for schleife in den konstruktor:
    for (i=0; i<emailadresse.length; i++){
    emailadresse = "";
    }
    oder was meinst du? 8|

    Und das null ausgegeben wird ist auch kein wunder du gibst nämlich immer das komplette Array aus, wenn du deine for-Schleife in verteilerAnzeigen nicht bis emailadresse.length sondern bis anzEintraege laufen lässt bekommste halt nur die brauchbaren EInträge ohne nulls.
  • Das mit der For schleife habe ich auc hversucht.

    Der Grudn für die Frage war ganz einfach: Das Array hat null stellen. diese will ich weghaben damit das ganze funktioniert.

    der code schaut momentan so aus: (ausgebessert.)

    Quellcode

    1. public class EmailVerteiler{
    2. private int anzEintraege;
    3. private String[] emailadresse;
    4. EmailVerteiler(int z){
    5. anzEintraege = 0;
    6. emailadresse = new String[z];
    7. }
    8. void speichereEintrag(String adresse){
    9. boolean pr1 = false;
    10. boolean pr2 = false;
    11. for (int i = 0;i<emailadresse.length;i++){
    12. if (adresse.equals(emailadresse[i])){
    13. pr1 = true;
    14. }
    15. if (pruefeAdresse(adresse)==true){
    16. pr2=true;
    17. }
    18. if (pr1 == true && pr2 ==true){
    19. if(anzEintraege<emailadresse.length){
    20. emailadresse[anzEintraege]=adresse ;
    21. anzEintraege++;
    22. }
    23. }
    24. }
    25. }
    26. boolean pruefeAdresse(String adresse){
    27. int PR3 = 0;
    28. boolean PR4 = false;
    29. boolean PRend = false;
    30. for (int a = 0;a<adresse.length();a++){
    31. if (adresse.charAt(a) =='@'){
    32. PR3 ++;
    33. }
    34. if (adresse.substring(adresse.length()-3,adresse.length()).equals(".at")){
    35. PR4=true;
    36. }
    37. }
    38. if(PR3 == 1 && PR4 == true){
    39. PRend = true;
    40. }
    41. return PRend;
    42. }
    43. String zeigeVerteiler(){
    44. String rueckgabe = "";
    45. for (int c = 0; c<anzEintraege;c++){
    46. rueckgabe = rueckgabe + emailadresse[code=c]+ ";";
    47. }
    48. return rueckgabe;
    49. }
    50. public static void main(String args[]){
    51. EmailVerteiler verteiler1 = new EmailVerteiler(10);
    52. verteiler1.speichereEintrag("irgendwer@gmx.at");
    53. verteiler1.speichereEintrag("niemand@gmx.at");
    54. verteiler1.speichereEintrag("unbekannt@gmx.at");
    55. verteiler1.speichereEintrag("irgendwer@gmx.at");
    56. System.out.println(verteiler1.zeigeVerteiler());
    57. }
    58. }
    Alles anzeigen


    Ic hhabe es ausprobiert. alles läuft ohne fehler, jedoch wird ncihts ausgegeben. ich bin halb am durchdrehen. -.-
  • LEWA schrieb:

    Ich habe es ausprobiert. alles läuft ohne fehler, jedoch wird ncihts ausgegeben. ich bin halb am durchdrehen. -.-
    kann es sein, dass du meinen post von ganz oben überlesen hast? o.o
    Da hab ich alles verbessert und du bekommst ne gescheite Ausgabe, abgesehen von den unnötigen nulls, aber wie gesagt wenn du deine Ausgabe Schleife nur bis anzEintraege laufen lässt verschwinden die auch.
  • Benutzer online 3

    3 Besucher