Ram*_* .S 13 java static-methods
public class Sample {
public void method()
{
System.out.println("normal hai");
}
public static void method1()
{
System.out.println("static hai");
}
public static void main(String[] args) {
Sample s = null;
s.method1();
s.method();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Exception in thread "main" java.lang.NullPointerException
at com.csvfile.sample.main(Sample.java:22)
static hai
Run Code Online (Sandbox Code Playgroud)
为什么订单改变了?它应该输出:
static hai
Exception in thread "main" java.lang.NullPointerException
at com.csvfile.sample1.main(Sample.java:22)
Run Code Online (Sandbox Code Playgroud)
Bor*_*der 16
你的问题是,Exception打印到System.err当你的代码版画System.out.
所以,如果没有一个命名不好的课程(PascalCase请),我们可以这样做:
public static void main(String[] args) throws Exception {
final System system = null;
system.out.println("Odd");
System.out.println(system.toString());
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
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)
Run Code Online (Sandbox Code Playgroud)
所以它们实际上是交错的.即输出的顺序未定义,因为有两个输出流被打印到控制台.
将代码更改为:
public static void main(String[] args) throws Exception {
final System system = null;
system.err.println("Odd");
System.err.println(system.toString());
}
Run Code Online (Sandbox Code Playgroud)
产生预期的结果.
您还可以捕获异常并将其打印System.out到达到相同的效果:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
PS我确定你知道这一点,但你永远不应该static在一个实例上调用一个方法class.你应该总是static在class自己上调用方法.所以在你的例子中,你应该总是:
public static void main(String[] args) {
sample1 s = new sample1();
s=null;
sample1.method1();
s.method();
}
Run Code Online (Sandbox Code Playgroud)
这是因为exception打印到STDERR并System.out.println()打印到STDOUT,两个流都不同步.
如果您第二次调用它,订单可以更改.
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |