Java Quiz

Ich weiß es ehrlich gesagt nicht, auf den ersten Blick könnte man eine Endlosschleife bei der Ausgabe vermuten, aber vielleicht hat die ArrayList dagegen einen Mechanismus.

List hat doch in Java keine ordentliche toString-Implementierung, also würde das doch nur diesen seltsamen ObjectHash ausgeben?

Aber ich glaube trotzdem, dass ich schon mal eine Exception zur Laufzeit bekommen habe. Irgend etwas mit self reference.

Sollte ja eigentlich dann toString von der Arraylist genommen werden (was auch normal der Fall ist)

Ohne nachzuschauen hätte ich auch gesagt dass es eine Endlosschleife gibt, es sei denn die ArrayList nimmt Arrays.toString was möglicherweise nicht tiefer in weitere Listen etc. geht

ArrayList hat meiner Meinung nach auch keine überschriebene toString

Edit:
Hab nachgeschaut, AbstractCollection implementiert eine toString. also hat ArrayList natürlich auch eine.
Hab den Code aber noch nicht getestet. Daher gilt meine Antwort von oben noch immer als meine Vermutung, dass bei add eine Exception fliegt.

Hab mal geschaut was passiert (also in der toString methode).
Dürfte eine interessante Ausgabe geben :smiley:

Da schon einiges geraten wurde, aber noch nicht die richtige Antwort dabei war, löse ich das mal auf:

Die Ausgabe ist...
[Do you know what, (this Collection), contains?]

Das hatte ich mal ausprobiert, im Kontext von meiner Antwort auf https://stackoverflow.com/q/49925107/3182664 . Allgemein ist es problematisch, wenn eine Collection sich selbst enthält (Details stehen in der Antwort). Aber hier ist zumindest der toString-Fall abgefangen, was zu dieser „sinnvollen“ Ausgabe führt :slight_smile:

2 „Gefällt mir“

Da war meine Vermutung ja gar nicht so falsch. Die Darstellung mittels [element1, element2, ...] kannte ich, nur wusste ich nicht, ob er die Selbst-Referenz abfängt.

Nun wäre es spannend zu sehen, was bei zwei Listen passiert, die sich gegenseitig enthalten:

List<Object> list1 = new ArrayList<Object>();
List<Object> list2 = new ArrayList<Object>();
list1.add("Do you know what");
list1.add(list2);
list1.add("contains?");
list2.add("Do you know what");
list2.add(list1);
list2.add("contains?");
System.out.println(list1);

int x = 0;
int b = ++x++;
System.out.println( b );
System.out.println( x );

einfach

1 (++x wird vor der Zuweisung ausgeführt)
2 (x++ wird nach der Zuweisung ausgeführt)

Tatsächlich lässt sich das nicht kompilieren.
Obwohl die Reihenfolge eigentlich klar ist, aber der Bedarf war wohl zu gering.

Hatte das zufällig auf Wikipedia gelesen.

2 „Gefällt mir“

Spannend, ich hatte mit der gleichen Ausgabe wie @Timothy_Truckle gerechnet.

Natürlich ohne Ausprobieren (und eigentlich auch ohne JavaDoc zu lesen) : Was wird ausgegeben?

public class ParsingQuiz
{
    public static void main(String[] args)
    {
        String string = null;
        int i = parseInt(string);
        float f = parseFloat(string);
        
    }

    private static int parseInt(String string)
    {
        try
        {
            return Integer.parseInt(string);
        }
        catch (NumberFormatException e)
        {
            System.out.println("Not an int: " + string);
            return 0;
        }
        catch (NullPointerException e)
        {
            System.out.println("The parseInt method received null");
            return 0;
        }
    }
    
    private static float parseFloat(String string)
    {
        try
        {
            return Float.parseFloat(string);
        }
        catch (NumberFormatException e)
        {
            System.out.println("Not a float: " + string);
            return 0.0f;
        }
        catch (NullPointerException e)
        {
            System.out.println("The parseFloat method received null");
            return 0.0f;
        }
    }
    
}

Da Marco seit April keine Antwort bekommen hat, erwarte ich mal keine mehr und würde einfach mal ein Nicht-Java-Quiz hier posten, was mir heute mittag übern weg gelaufen ist:

Gegeben ist folgender PHP-Code:

<?php
$arg = 'T';
$vehicle = ( ( $arg == 'B' ) ? 'bus' :
             ( $arg == 'A' ) ? 'airplane' :
             ( $arg == 'T' ) ? 'train' :
             ( $arg == 'C' ) ? 'car' :
             ( $arg == 'H' ) ? 'horse' :
             'feet' );
echo $vehicle;

Was wird ausgegeben?

Nunja, ich kenne die Operatorrangfolge in PHP nicht, ich muss raten:

Zusammenfassung

feet (oder NULL)

Ich hätte train gesagt.

Ich hätte auch train gesagt, aber da das die naheliegendste Antwort ist, und es daher wohl kein Rätsel wert ist, nehme ich an, dass es wohl falsch ist.

Richtig. Bisher ist alles falsch was genannt wurde :wink:

Ich habe da nachgeguckt, was da raus kommt und bin sehr auf die Erklärung gespannt.

Da meine Antwort auch die Java-Antwort gewesen wäre und nur leichte Vermutungen in Richtung Ausführungsreihenfolge gingen… in den PHP docs befindet sich die Antwort.

Ich bin gerade mit mir selbst in heftigem Diskurs ob es PHP falsch macht, oder ob es in Java falsch aber „convenient“ ist, was es dann irgendwie wiederum richtig machen würde, weil das nun mal die Aufgabe einer Programmiersprache ist.

So wie ich das jetzt verstanden habe (?)

Immer strikt von Links nach Rechts

( $arg == ‚B‘ ) ? ‚bus‘ : ( $arg == ‚A‘ )
= ( $arg == ‚A‘ )
= false

false ? ‚airplane‘ : ( $arg == ‚T‘ )
= ( $arg == ‚T‘ )
= true

true ? ‚train‘ : ( $arg == ‚C‘ )
= ‚train‘

‚train‘ ? ‚car‘ : ( $arg == ‚H‘ )
= ‚car‘

‚car‘ ? horse’ : ‚feet‘
= ‚horse‘

https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary

Ich habe es nicht ausprobiert was bei Java wirklich passiert, aber so wie PHP es macht (bzw. wie du es darstellst) „kann“ es wegen der Typsicherheit ja gar nicht gehen weil ab dem Punkt wo kein boolean mehr vor dem ? ist Java aussteigen müsste