2015-06-19 19 views
13
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(); 
    } 
} 

và đầu ra là:tự thực hiện của phương pháp tĩnh

Exception in thread "main" java.lang.NullPointerException 
     at com.csvfile.sample.main(Sample.java:22) 

static hai 

Tại sao trật tự thay đổi? Nó nên đầu ra:

static hai 
Exception in thread "main" java.lang.NullPointerException 
    at com.csvfile.sample1.main(Sample.java:22) 
+0

@kocko Vì đó là thứ tự mà ông gọi là các phương pháp trong ... – immibis

+0

Gọi một phương thức tĩnh trên một biến mẫu là kiểu mã hóa xấu để bắt đầu. Luôn gọi các phương thức tĩnh trên chính lớp đó: 'sample1.method1()' –

+0

http://stackoverflow.com/questions/1883321/java-system-out-println-and-system-err-println-out-of-order – Marvin

Trả lời

5

Đó là bởi vì các exception được in để thiết bị lỗi chuẩn và System.out.println() được in để STDOUT và cả hai con suối chưa đồng bộ.

Nếu bạn gọi nó lần thứ hai, thứ tự có thể thay đổi.

+0

nope nó không thay đổi –

+10

@ Ramaiah.S tôi đã viết nó 'can' not' must' – Jens

16

Sự cố bạn gặp phải là Exception được in thành System.err trong khi mã của bạn được in thành System.out.

Vì vậy, không có một lớp nặng tên (PascalCase xin vui lòng), chúng tôi có thể làm:

public static void main(String[] args) throws Exception { 
    final System system = null; 
    system.out.println("Odd"); 
    System.out.println(system.toString()); 
} 

Và kết quả tôi nhận được là:

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) 

Vì vậy, họ đang thực sự xen kẽ. tức là thứ tự của đầu ra là không xác định vì có hai luồng đầu ra được in ra bảng điều khiển.

Thay đổi mã để:

public static void main(String[] args) throws Exception { 
    final System system = null; 
    system.err.println("Odd"); 
    System.err.println(system.toString()); 
} 

Tạo kết quả mong muốn.

Bạn cũng có thể nắm bắt những ngoại lệ và in nó để System.out để đạt được hiệu quả tương tự:

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); 
    } 
} 

T.B. Tôi chắc chắn bạn biết điều này, nhưng bạn không bao giờ nên gọi phương thức static trên một phiên bản của class. Bạn phải luôn gọi phương thức static trên chính bản thân số class. Vì vậy, trong ví dụ của bạn, bạn nên luôn luôn làm:

public static void main(String[] args) { 
    sample1 s = new sample1(); 
    s=null; 
    sample1.method1(); 
    s.method(); 
} 
+0

Bạn có thể cũng có thể đạt được hiệu ứng bằng cách gọi 'System.out.flush()' trước khi ném ngoại lệ. – Justin

+0

@Quincunx giả định rằng trình mô phỏng thiết bị đầu cuối của bạn không thực hiện một số bộ đệm khác và tất cả các loại chưa biết - có, nên hoạt động. –

1

Điều này là do ra và sai là hai luồng đầu ra khác nhau. Tuy nhiên, cả hai đều in trên bảng điều khiển. Vì vậy, bạn không thấy chúng dưới dạng các luồng khác nhau. Hãy thử mã dưới đây và kiểm tra đầu ra.

for (int i = 0; i < 10; i++) { 
     System.out.println(i); 
     System.err.println(i); 
} 
0

Chỉ cần một tốt để biết điều trong Java:

Trong Java có một số loại fileds init: ta hãy xem một ví dụ:

public class HunarianEngineer{ 

static{ 
     System.out.println("1.This is a static block, called when the JVM pull in the class first time ever"); 
} 

{ 
System.out.println("2.This is an instance block, runs before constructor"); 
} 

public HungarianEngineer(){ 
    System.out.println("3.I`m a constructor"); 
} 

}//EndOfClass 

Đọc thêm về họ: https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html hoặc ở đây:

http://www.thejavageek.com/2013/07/21/initialization-blocks-constructors-and-their-order-of-execution/

+2

Làm thế nào để điều này liên quan đến câu hỏi được hỏi? –

Các vấn đề liên quan