Il problema è che il Exception
viene stampato su System.err
mentre il codice viene stampato su System.out
.
Così, senza una classe di mal di nome (PascalCase
per favore) che possiamo fare:
public static void main(String[] args) throws Exception {
final System system = null;
system.out.println("Odd");
System.out.println(system.toString());
}
E l'uscita che ottengo è:
Exception in thread "main" java.lang.NullPointerException
Odd
at com.boris.testbench.App.main(App.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Quindi sono in realtà Interleaved. Ad esempio, l'ordine dell'uscita è non definito in quanto vi sono due flussi di output che vengono stampati sulla console.
Modifica del codice a:
public static void main(String[] args) throws Exception {
final System system = null;
system.err.println("Odd");
System.err.println(system.toString());
}
produce il risultato desiderato.
Si potrebbe anche intercettare l'eccezione e stamparlo System.out
per ottenere lo stesso effetto:
public static void main(String[] args) throws Exception {
final System system = null;
system.out.println("Odd");
try {
System.out.println(system.toString());
} catch (RuntimeException ex) {
ex.printStackTrace(System.out);
}
}
P.S. Sono certo che lo sai, ma non dovresti mai chiamare un metodo static
su un'istanza di class
. Dovresti sempre chiamare il metodo static
sullo stesso class
. Quindi, nel tuo esempio, dovresti sempre farlo:
public static void main(String[] args) {
sample1 s = new sample1();
s=null;
sample1.method1();
s.method();
}
fonte
2015-06-19 07:20:00
@kocko Perché è l'ordine che ha chiamato i metodi in ... – immibis
La chiamata di un metodo statico su una variabile di istanza è uno stile di codifica errato. Chiamate sempre metodi statici sulla classe stessa: 'sample1.method1()' –
http://stackoverflow.com/questions/1883321/java-system-out-println-and-system-err-println-out-of-order – Marvin