简体   繁体   中英

Nested if-statements get very long and hard to overview what is actually wrong

This is the continuation of the project from my last question. Its basically a program that return console messages by recieving user-input with a scanner. It's a school programm that has a class creating grades with ArrayLists that store the students in their respective grade. Some students can also be class speaker or student speaker which are also stored in their own ArrayLists. The program asks the user to enter a category which leads to the coresponding path through nested if-statements. If the if-statements dont get fulfilled an error message shows up on the console and loops back to the beginning.

The way I set up the program the nested if statements should work, but its still causing problems and I dont know what to do.

I'm from Germany, so I'm sorry for some German words in the programm.

This is the code:

    package package_Fachklassen;

    import java.util.Scanner;

    public class Startklasse {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Schulklasse sk1, sk2;
    sk1 = new Schulklasse("WG 13-1");
    sk2 = new Schulklasse("WG 13-2");

    Sprecher ks1, sss1;
    ks1 = new Sprecher("Klassensprecher");
    sss1 = new Sprecher("Schülersprecher");

    Spezial kS1, kS2, kS3, kS4, sS1, sS2;
    kS1 = new Spezial("Cem", "Yildiz", 19, sk2, ks1);
    kS2 = new Spezial("Fatima", "Baba", 19, sk2, ks1);
    kS3 = new Spezial("Rüveyda", "Yildiz", 20, sk1, ks1);
    kS4 = new Spezial("Zvoni", "Jogovic", 19, sk1, ks1);
    sS1 = new Spezial("Cem", "Yildiz", 19, sk2, sss1);
    sS2 = new Spezial("Fatima", "Baba", 19, sk2, sss1);

    ks1.addKlassensprecher(kS1);
    ks1.addKlassensprecher(kS2);
    ks1.addKlassensprecher(kS3);
    ks1.addKlassensprecher(kS4);
    sss1.addSchuelersprecher(sS1);
    sss1.addSchuelersprecher(sS2);


    //Klasse 13-1

    Schueler s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20;
    s1 = new Schueler("Gonzalo", "Cofre Real", 18, sk1);
    s2 = new Schueler("Swaastika", "Yogeswaran", 19, sk1);
    s3 = new Schueler("Derin", "Sipahi", 19, sk1);
    s4 = new Schueler("Henry", "Reinhold", 19, sk1);
    s5 = new Schueler("Sara", "Perkovic", 19, sk1);
    s6 = new Schueler("Honia", "Aref", 19, sk1);
    s7 = new Schueler("Finn", "Bolheimer", 17, sk1);
    s8 = new Schueler("Karoline", "Garkos", 18, sk1);
    s9 = new Schueler("Hannah", "Hirth", 18, sk1);
    s10 = new Schueler("Sarah", "Schwarz", 18, sk1);
    s11 = new Schueler("Rüveyda", "Yildiz", 20, sk1);
    s12 = new Schueler("Jibi", "Saji", 18, sk1);
    s13 = new Schueler("Rida", "Jafari", 18, sk1);
    s14 = new Schueler("Patrick", "Bruhn", 18, sk1);
    s15 = new Schueler("Andre", "Rosenau", 19, sk1);
    s16 = new Schueler("Irini", "Chrisivolanto", 19, sk1);
    s17 = new Schueler("Xenia", "Aschenbrenner", 19, sk1);
    s18 = new Schueler("Kristina", "Jokic", 19, sk1);
    s19 = new Schueler("Yavuz", "Salik", 21, sk1);
    s20 = new Schueler("Zvonimir", "Jogovic", 19, sk1);


    sk1.addSchueler(s1);
    sk1.addSchueler(s2);
    sk1.addSchueler(s3);
    sk1.addSchueler(s4);
    sk1.addSchueler(s5);
    sk1.addSchueler(s6);
    sk1.addSchueler(s7);
    sk1.addSchueler(s8);
    sk1.addSchueler(s9);
    sk1.addSchueler(s10);

    //Klasse 13-2

    Schueler ss1, ss2, ss3, ss4, ss5, ss6, ss7, ss8;
    ss1 = new Schueler("Cem", "Yildiz", 19, sk2);
    ss2 = new Schueler("Fathima", "Baba", 19, sk2);
    ss3 = new Schueler("Sanjie", "Bislimi", 19, sk2);
    ss4 = new Schueler("Jasmine", "Jaffari", 19, sk2);
    ss5 = new Schueler("Hannah", "Arent", 19, sk2);
    ss6 = new Schueler("Niklas", "Genf", 18, sk2);
    ss7 = new Schueler("Celina", "Musollaj", 18, sk2);
    ss8 = new Schueler("Naomi", "Schmidt", 19, sk2);

    sk2.addSchueler(ss1);
    sk2.addSchueler(ss2);
    sk2.addSchueler(ss3);
    sk2.addSchueler(ss4);
    sk2.addSchueler(ss5);
    sk2.addSchueler(ss6);

    String schueler = "Schüler";
    String sprecher = "Sprecher";


    String ksSuche = "KS-Suche";
    String ssSuche = "SS-Suche";
    String ksAlle = "KS-Alle";
    String ssAlle = "SS-Alle";

    while(true) 
    {   
        Scanner firstscan = new Scanner(System.in);
        System.out.println("Nach welcher Kategorie suchen Sie?");
        String f_input = firstscan.nextLine();
        boolean studentmissing = true;
            if(f_input.equals(schueler)) 
            {
                Scanner scan = new Scanner(System.in);
                System.out.println("Welche Klasse besucht der gesuchte Schüler?");
                String k_input= scan.nextLine();

                    if(k_input.equals(sk1.getBezeichnung())) 
                    {
                        System.out.println("Welchen SChüler aus Klasse 13-1 suchen Sie?");
                        String n_input = scan.nextLine();
                        for(int i = 0; i < sk1.getListenLaenge(); i++) 
                        {
                            if(n_input.equals(sk1.getSchueler(i).getName()) || n_input.equals(sk1.getSchueler(i).getNachname())) 
                            {
                                studentmissing = false;
                                System.out.println("Ihr Schüler:");
                                System.out.println(" " + sk1.getSchueler(i).getName());
                                System.out.println(" " + sk1.getSchueler(i).getNachname());
                                System.out.println(" " + sk1.getSchueler(i).getAlter());
                                break;
                            }
                        }
                        if(studentmissing) 
                        {
                        System.out.println("Schüler existiert nicht oder ist nicht in dieser Klasse!");
                        System.out.println("--------------------------------------------------------");
                        }

                    }
                    else if(k_input.equals(sk2.getBezeichnung())) 
                    {
                        System.out.println("Welchen Schüler aus Klasse 13-2 suchen Sie?");
                        String n2_input = scan.nextLine();
                        for(int i = 0; i < sk1.getListenLaenge(); i++)
                        {
                            if(n2_input.equals(sk2.getSchueler(i).getName()) || n2_input.equals(sk2.getSchueler(i).getNachname()))
                            {
                                studentmissing = false;
                                System.out.println("Ihr Schüler:");
                                System.out.println(" " + sk2.getSchueler(i).getName());
                                System.out.println(" " + sk2.getSchueler(i).getNachname());
                                System.out.println(" " + sk2.getSchueler(i).getAlter());
                                break;
                            }
                        }
                        if(studentmissing) 
                        {
                            System.out.println("Schüler existiert nicht oder ist nicht in dieser Klasse!");
                            System.out.println("--------------------------------------------------------");
                        }
                    }
                }

                else if(f_input.equals(sprecher))
                {
                    Scanner ksScanner = new Scanner(System.in);
                    System.out.println("Suchen Sie nach Klassensprechern oder Schülersprechern?");
                    String ks_input = ksScanner.nextLine();

                    if(ks_input.equals(ksSuche))
                    {
                        System.out.println("Geben sie den Namen der gesuchten Person ein!");
                        String sn_input = firstscan.nextLine();
                        boolean ksMissing = true;
                        for(int i = 0; i < ks1.getListLengthKS(); i++)
                        {
                            if(sn_input.equals(ks1.getKlassensprecher(i).getName()) || sn_input.equals(ks1.getKlassensprecher(i).getNachname()))
                            {
                                ksMissing = false;
                                System.out.println("Ihr Schüler:");
                                System.out.println(" " + ks1.getKlassensprecher(i).getName());
                                System.out.println(" " + ks1.getKlassensprecher(i).getNachname());
                                System.out.println(" " + ks1.getKlassensprecher(i).getAlter());
                                break;
                            }
                        }
                        if(ksMissing) 
                        {
                                System.out.println("Schüler ist nicht gespeichert!");
                                System.out.println("-------------------------------------------------");
                        }
                    }
                }
                else if(f_input.equals(ssSuche))
                {
                    System.out.println("Geben sie den Namen des Schülersprechers ein!");
                    String ss_Input = firstscan.nextLine();
                    boolean ssMissing = true;
                    for(int i = 0; i < sss1.getListLengthSS(); i++) 
                    {       
                        if(ss_Input.equals(sss1.getSchuelersprecher(i).getName()) || ss_Input.equals(sss1.getSchuelersprecher(i).getNachname()))
                        {
                            ssMissing = false;
                            System.out.println("Ihr Schüler:");
                            System.out.println(" " + sss1.getSchuelersprecher(i).getName());
                            System.out.println(" " + sss1.getSchuelersprecher(i).getNachname());
                            System.out.println(" " + sss1.getSchuelersprecher(i).getAlter());
                            break;
                        }

                    }
                    if(ssMissing) 
                    {
                        System.out.println("Schüler ist nicht gespeichert!");
                        System.out.println("-------------------------------------------------");
                    }
                }
                else if(f_input.equals(ksAlle)) 
                {
                    ks1.showKlassensprecher();
                }
                else if(f_input.equals(ssAlle))
                {
                    sss1.showSchuelersprecher();
                }
            }

    }           
}

Most of the function get executed. Problems appear with the case of a value that doesnt fulfill the condition. And every function from "else if(f_input.equals(ssSuche))" just jumps back to the beginning.

These are some examples from the console in the case of student search:

    Nach welcher Kategorie suchen Sie?
    Schüler
    Welche Klasse besucht der gesuchte Schüler?
    WG 13-1
    Welchen SChüler aus Klasse 13-1 suchen Sie?
    Derin
    Ihr Schüler:
    Derin
    Sipahi
    19
    Nach welcher Kategorie suchen Sie?
    Schüler
    Welche Klasse besucht der gesuchte Schüler?
    WG 13-1
    Welchen SChüler aus Klasse 13-1 suchen Sie?
    Cem
    Schüler existiert nicht oder ist nicht in dieser Klasse!
    --------------------------------------------------------
    Nach welcher Kategorie suchen Sie?
    Schüler
    Welche Klasse besucht der gesuchte Schüler?
    WG 13-2
    Welchen Schüler aus Klasse 13-2 suchen Sie?
    Cem
    Ihr Schüler:
    Cem
    Yildiz
    19
    Nach welcher Kategorie suchen Sie?
    Schüler
    Welche Klasse besucht der gesuchte Schüler? 
    WG 13-2
    Welchen Schüler aus Klasse 13-2 suchen Sie? 
    Derin
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
         at java.util.ArrayList.rangeCheck(Unknown Source)
         at java.util.ArrayList.get(Unknown Source)
         at package_Fachklassen.Schulklasse.getSchueler(Schulklasse.java:27)
         at package_Fachklassen.Startklasse.main(Startklasse.java:144)

This is a example of the other console output:

    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    KS-Suche
    Geben sie den Namen der gesuchten Person ein!
    Cem
    Ihr Schüler:
     Cem
     Yildiz
     19
    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    KS-Suche
    Geben sie den Namen der gesuchten Person ein!
    Derin
    Schüler ist nicht gespeichert!
    -------------------------------------------------
    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    SS-Suche
    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    KS-Alle
    Nach welcher Kategorie suchen Sie?
    Sprecher
    Suchen Sie nach Klassensprechern oder Schülersprechern?
    SS-Alle
    Nach welcher Kategorie suchen Sie?

Even though there are missing classes and your sample code is spaghetti code, I tried to parse it in my mind. I noticed lots of unnecessary code duplication. While you were programming via copy, paste and edit you made a mistake (maybe also other mistakes, I just stopped at the first one I noticed):

        else if (k_input.equals(sk2.getBezeichnung())) {
          System.out.println("Welchen Schüler aus Klasse 13-2 suchen Sie?");
          String n2_input = scan.nextLine();
          for (int i = 0; i < sk1.getListenLaenge(); i++) {
            //                ^^^
            //             Uh-oh, this should be sk2!

When trying to handle the second class (German: Schulklasse) sk2 , but iterating over the list length of sk1 (which has more students than sk2 ), no surprise that you get an IndexOutOfBoundsException because student #6 does not exist in sk2 , only students #0 to #5.


Update: I just noticed that there is a second question/problem contained in your question, ie why the search for "Schulsprecher" does not work as expected. You have a structural error in your nested if-else:

      else if (f_input.equals(ssSuche)) {
        System.out.println("Geben sie den Namen des Schülersprechers ein!");
        String ss_Input = firstscan.nextLine();

Actually here (and also in the two following cases) you don't want to compare f_input to ssSuche but rather use ks_input for the comparison. Furthermore, the else if 's should be appended to the inner if , not to the outer one. Do you understand what I am talking about?


I can see that you are a programming beginner, so please don't worry. You learn by making and fixing mistakes. :-) But I recommend that you ask someone who is more experienced to help you refactor your spaghetti code into something more readable, less redundant and more maintainable and testable. You have a lot of unnecessary hard-coded stuff in there which ought to be generalised so you don't need to copy and modify code anymore. Good luck!

PS: If you really push your project to GitHub, as I suggested, I can show you how to refactor this mess, using a set of small Git commits, so you can see step by step what I am doing. Maybe it helps you understand how to write better code.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM