Übrigens darf man vor floats und doubles soviele Nullen schreiben, wie man will, sie werden nie oktal interpretiert.
Das kann manchmal vorkommen, wenn man irgendwelche Zahlen liest (z.B. aus einer Datei) die vorne mit 0en gepadded sind
12513
45355
04235 <- Autsch!
35455
Ich finde aber viel schlimmer, dass 062l
hier 50 ergibt, bzw. auch wenn man zur Basis 10 rechnet, ist 62l
eben 62
(BTW: Das war Absicht. Man rechnet IMMER “zur Basis 10” :D)
Stimmt. Und wenn der Ganzanteil nur eine 0 ist, also nicht vorhanden (0000000000000.4711), dann kann man den Ganzanteil auch ganz weglassen und gleich mit dem Punkt beginnen (.4711). Analog auch beim Fließkommaanteil, 4711. ergibt auch 4711.0. Was nicht geht ist nur den Punkt stehen zu lassen Also entweder 0. oder .0 muss sein
Bissle ruhig hier, oder?
Ich poste einfach mal eine neue Frage;):
public static void main(String[] args) {
System.setOut(System.out);
System.out.println("C# ist cool!");
}
Wie kann man hier noch erreichen, dass nur ausgegeben wird “Java ist cool!”, ohne die main zu ändern?
VG
In einem static initializer setOut mit einem ‘out’ aufrufen, dessen println passend überschrieben ist…?!
Oder eine Klasse System mit dem gleichen Package wie die Klasse mit der main()-Methode spendieren, in der es ein Member namens out mit einem entsprechend entarteten PrintStream gibt.
Alternativ im static initializer “Java ist cool!” ausgeben und dann mit setOut einem PrintStream setzen, der keine Ausgaben mehr machen kann.
OutputStream erzeugen
[spoiler]```static {
System.setOut(new PrintStream(new InterceptingStream(System.out)));
}
private static class InterceptingStream extends OutputStream {
private boolean lastC = false;
private final PrintStream out;
private InterceptingStream(PrintStream out) {
this.out = out;
}
@Override
public void write(int b) throws IOException {
if (lastC) {
lastC = false;
if (b == '#') {
out.print("Java");
return;
} else out.print("C");
}
if (b == 'C')
lastC = true;
else
out.print((char) b);
}
}```[/spoiler]
Eher im Initializer einen abgeleiteten PrintStream mit System.setOut() setzen, dessen println-Methode überlagert wurde und nur „Java ist cool!“ ausgibt. Oder meinst du das sogar?
Was anderes wüsste ich jetzt aber auch nicht …
[QUOTE=cmrudolph]Alternativ im static initializer “Java ist cool!” ausgeben und dann mit setOut einem PrintStream setzen, der keine Ausgaben mehr machen kann.
[/QUOTE]
Oder noch einfacher:
static {
System.out.println( "Java ist cool!");
System.exit( 0);
}
Das mit dem passenden OutputStream ist eine gute Idee, meinte ich aber nicht. Hatte eher an etwas gedacht, dass auch folgendes Programm uns mitteilt „Java ist cool!“
public static void main(String[] a) public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "C# ist cool!");
}
PS: Gedacht war es OHNE eine eigene JOptionPane-Klasse und System.exit();, wusste nur nicht, dass es so viele Möglichkeiten gibt.
LG
[QUOTE=SpaceFiller]Das mit dem passenden OutputStream ist eine gute Idee, meinte ich aber nicht. Hatte eher an etwas gedacht, dass auch folgendes Programm uns mitteilt “Java ist cool!”
public static void main(String[] a) public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "C# ist cool!");
}
```[/QUOTE]
Verstehe ich nicht, ich habe gedacht, die main soll nicht verändert werden.
Btw, ich hätte noch: `java Main | sed 's/C#/Java/'` :D
Man kann auch den String-Pool selbst manipulieren: http://www.javaspecialists.eu/archive/Issue014.html
Die Änderung, die beim ersten Fall zu machen wäre, sollte auch bei diesem, weiteren Beispiel die gleiche Ausgabe erzeugen.
Alternativen wurden jetzt ja einige genannt, aber offenbar nicht die gesuchte …
Daran hatte ich auch gedacht.
Oder kürzer:
static {
try {
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
value.set("C# ist cool!", value.get("Java ist cool!"));
} catch (Exception e) {
throw new Exception();
}
}```
Reflection ist schon böse… Wieder was gelernt. Ich mag diesen Thread
Kann man eigentlich ein Array in sich selbst packen?
Mal ganz konkret:
Object[] array = new Object[1];
array[0] = array;
for(Object[] a = array; ; a = (Object[]) a[0]){
System.out.println(".");
}
Compiliert das? Wenn ja, gibt es einen Laufzeitfehler?
Ich wüsste keinen Grund, weshalb das nicht gehen sollte.
Vom Prinzip her entspricht das wohl einer zyklisch verketteten Liste mit nur einem Element und ohne Daten
Ergo: Endlosschleife ohne Laufzeitfehler (wird ja kein Stack aufgebaut und der Speicher wird auch nicht voller).
Ich habe es mal ausprobiert. Nett.
Wenn wir schon dabei sind:
Funktioniert das auch in Swing?
panel.add(panel);```
Kompilieren tut es sicher, aber ich vermute, bei der Ausführung wird eine Exception geworfen