Exercise "Even or odd? "





  • Hi,

    Mir ist beim lösen der Aufgabe etwas Merkwürdiges aufgefallen.

    Wenn der try-Block in der Schleife ist und nicht umgekehrt, funktioniert der Scanner nur im ersten Schleifendurchlauf.
    Auch wenn es unnötig ist, aber rein logisch sollte es doch genau so funktionieren oder verstehe ich da was falsch?

    Version 1 (Ähnlich der Musterlösung):

    package _01_Aufgaben;
    
    import java.util.Scanner;
    
    public class No063
    {
        public static void main(String[] args)
        {
            boolean isInt = false;
            while (!isInt)
            {
                try (Scanner scan = new Scanner(System.in))
                {
                    System.out.print("Enter a Year:");
                    
                    int year = scan.nextInt();
                    boolean leapYear;
                    
                    if (year%4 != 0)        leapYear = false;   // if (year is not divisible by 4) then (it is a common year)
                    else if (year%100 != 0) leapYear = true;    // else if (year is not divisible by 100) then (it is a leap year)
                    else if (year%400 != 0) leapYear = false;   // else if (year is not divisible by 400) then (it is a common year)
                    else                    leapYear = true;    // else (it is a leap year)
        
                    System.out.println(year + " Is a leap year.");
                    System.out.println(year + " Is not a leap year.");
                    isInt = true;
                }
            }
        }
    }
    

    Version 2 (Funktioniert bis zum 2. Schleifendurchlauf)

    package _01_Aufgaben;
    
    import java.util.Scanner;
    
    public class No071_V2
    {
        public static void main(String[] args)
        {
            int value;
            do
            {
                try (Scanner scan = new Scanner(System.in))
                {
                    System.out.print("Enter an integer (0 to terminate): ");
                    
                    value = scan.nextInt();
                    
                    if (value % 2 == 0)
                    {
                        System.out.println(value + " is an even number");
                    } else
                    {
                        System.out.println(value + " is an odd number");
                    }
                }
            } while (value != 0);
            System.out.println("Goodbye :)");
        }
    }
    

    Fehlermeldung:

    Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    at _01_Aufgaben.No071_V2.main(No071_V2.java:16)```


  • Die Antwort ist leider ohne Wissen über Inhalte des Kapitels interface definitions and abstract Classes nicht zu verstehen. Ein try-with-resources Block:

    try (final Scanner scanner = new Scanner(System.in)) {
       // Code using scanner
    }
    

    ist äquivalent zu:

    {
      final Scanner scanner = new Scanner(System.in);
      // Code using scanner
      scanner.close(); // Internally calling System.in.close() before closing the scanner itself
    }
    

    Dies geht beim ersten Schleifendurchlauf noch gut. Danach ist der Standard Eingabestrom System.in allerdings geschlossen und kann nicht mehr verwendet werden. Trotzdem erfolgt der Versuch einer Verwendung im zweiten Schleifendurchlauf, welcher dann scheitert.

    Sie können den Fehler auch unmittelbar mit folgendem, leicht vereinfachten Beispiel, reproduzieren:

    try {
      System.in.close();
    } catch (IOException e) {}
    
    final Scanner scanner = new Scanner(System.in);
    System.out.println(scanner.nextInt());
    

    Auch dieser Code liefert einen zu Ihrem Beispiel äquivalenten Stacktrace:

    Exception in thread "main" java.util.NoSuchElementException
    	at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    	at java.base/java.util.Scanner.next(Scanner.java:1594)
    	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    	at de.hdm_stuttgart.mi.sd1.Q.main(Q.java:15)
    

Log in to reply