Java Rätsel

Hallo,

gegeben sei folgender Code:
Java:
package de.tutorials;

public class WhatsGoingOn {
  public static void main(String[] args) {
    //?
    System.out.println(new String("xxx"));
  }
}

Was kann man an Stelle von "?" schreiben damit das Programm folgende Ausgabe erzeugt?
Die Aufgabe ist auf mehrere verschiedene Arten lösbar.

Ausgabe:
Code:
huch?

Aufrufe von System.exit(...) / Reflection-Calls sowie Verwendung von AspectJ oder anderen AOP Frameworks sind nicht erlaubt!

Gruß Tom
 
Hier meine Lösung, die zumindest bei mir wunderbar funktioniert hat:

Code:
Achtung Spoiler:
package de.tutorials;

public class WhatsGoingOn {
  public static void main(String[] args) {
    System.setOut(new java.io.PrintStream(System.out) {
                                                        public void println(String x) {
                                                            super.println(x.equals("xxx") ? 
                                                            "huch?" : x);
                                                        }});
    System.out.println(new String("xxx"));
  }
}
 
Noch ne Möglichkeit:

public class WhatsGoingOn {
public static void main(String[] args) {
class String {

public String(java.lang.String s) {
}

@Override
public java.lang.String toString() {
return "huch?";
}
}
System.out.println(new String("xxx"));
}
}
 
So gehts auch:

Code:
public class WhatsGoingOn {
  public static void main(String[] args) {
    System.out.println(new String("huch?"));
    if (false)
    System.out.println(new String("xxx"));
  }
}

/duck
 
ich hätte auch noch einen.... Ähnliche Idee wie Zeja
import java.io.PrintStream;

public class WhatsGoingOn {
public static void main(String[] args) {

System.setOut(new PrintStream(System.out){

@Override
public void println(String x) {

super.println("Huch");
}

});

System.out.println(new String("xxx"));
}
}
 
Hallo,

da für das letzte Rätsel schon so ziemlich jede Lösungsvariante gepostet wurde gibts hiermit ein neues Rätsel:

Folgendes Programm läuft mit 48MB Heap (-Xmx48m) bricht kurz nach dem Start mit einem (java.lang.OutOfMemoryError: Java heap space) ab.

Java:
package de.tutorials;

import java.util.ArrayList;
import java.util.List;

public class MemoryLeakExample {
    public static void main(String[] args) {
        List<List<?>> lists = new ArrayList<List<?>>();
        
        for(int i = 0; i < 100;i++){
            List<Integer> list = new ArrayList<Integer>();
            
            for(int j = 0; j < 1000000;j++){
                list.add(j);
            }
            lists.add(list);
            
            System.out.println(i);
            list.clear();
 //+
           ?
//-
        }
        
        System.out.println(lists);
    }
}

Was könnte man noch bei ? aufrufen um den OOME abzuwenden?

Regeln:
1) lists darf nicht null gesetzt / neu initialisiert oder mit clear() geleert werden.
2) Kein Thread Sleep
3) Kein System.gc() etc.
4) lists soll am Ende noch die ursprünglich hinzugefügten List Instanzen beinhalten
Edit:
5) -Xmx48m (Heap Size auf 48 MB beschränken)
6) Es dürfen nur beliebig viele Zeilen zwischen //+ und //- eingefügt werden

Gruß Tom
 
Also bei mir ist das Programm unter Java 6 32-bit version und Windows 7 64-bit Version durchgelaufen. Daraufhin habe ich den Heapsize auf 256 gesetzt um den Effekt zu bekommen.

Nachfolgende Lösung läuft dann bei mir durch:

package de.tutorials;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MemoryLeakExample {
public static void main(String[] args) {
List<List<?>> lists = new ArrayList<List<?>>();

for(int i = 0; i < 100;i++){
List<Integer> list = new ArrayList<Integer>();

for(int j = 0; j < 1000000;j++){
list.add(j);
}
lists.add(list);

System.out.println(i);
list.clear();
//?
lists.remove(list);
// lists.add(Collections.unmodifiableList(list));
lists.add(list);
}

System.out.println(lists);
}
}
 
Zuletzt bearbeitet:
Zurück