2012-01-03 23 views
17

Tôi đang sử dụng IDE Eclipse Helios để phát triển Ứng dụng Web của chúng tôi. Trong phần Sự cố trong Eclipse, đối với một số dòng mô tả được hiển thị dưới dạng "Mã chết".Mã Dead có nghĩa là gì trong các Vấn đề về IDE của Eclipse Phần

Có ai vui lòng cho tôi biết Mã số thực sự có nghĩa là gì?

Vui lòng xem ảnh chụp màn hình để bạn tham khảo.

enter image description here

Ví dụ phần này được hiển thị dưới dạng mã chết dưới Eclipse

else { 
     int length; 
     if (ar != null) 
      length = Array.getLength(ar); 
     else 
      length = 0; // This line is dead code 
+1

Có lẽ bởi vì nó có thể chứng minh rằng 'ar' sẽ KHÔNG BAO GIỜ được null ở đó - không có mã chúng ta càng không thể nói chắc chắn (nhưng nếu không nó sẽ được một lỗi và tôi có khuynh hướng tìm kiếm các lỗi trong mã của bạn hơn là trong trình biên dịch eclipse;)) – Voo

+0

Chỉ cần lưu ý - Eclipse đôi khi bị lỗi. Tôi đã thấy Eclipse Neon đưa ra lỗi "mã chết" cho mã được chứng minh là không chết. –

Trả lời

35

Trong Eclipse, "mã chết" là mã mà sẽ không bao giờ được thực thi. Thông thường nó nằm trong nhánh có điều kiện mà sẽ không bao giờ được nhập vào hợp lý.

Một ví dụ nhỏ sẽ là như sau:

boolean x = true; 
if (x) { 
    // do something 
} else { 
    // this is dead code! 
} 

Nó không phải là một lỗi, vì nó vẫn còn java hợp lệ, nhưng đó là một cảnh báo hữu ích, đặc biệt là nếu các điều kiện logic rất phức tạp, và nơi mà nó có thể không trực quan rõ ràng rằng mã sẽ không bao giờ được thực thi.

Trong ví dụ cụ thể của bạn, Eclipse đã tính toán rằng ar sẽ luôn là không rỗng và do đó chi nhánh else length = 0 sẽ không bao giờ được thực thi.

Và có, đó là có thể rằng Eclipse là sai, nhưng nhiều khả năng nó không phải là.

+0

Tôi đã sửa đổi câu hỏi của mình, câu hỏi của tôi là vui lòng cho tôi biết làm thế nào Eclipse có thể quyết định rằng đây là mã chết? bởi vì theo ý kiến ​​của tôi, ý kiến ​​Eclipse cũng có thể sai? – Pawan

+0

@skaffman, Có phải mã đã bị xóa để mã không xuất hiện trong bytecode không? – Pacerier

+0

Nó đã lưu tôi .... –

5

Mã chết là mã sẽ không bao giờ được thi hành, ví dụ:

boolean b = true 
if (!b) { 
    .... 
    // dead code here 
} 
3

Mã chết nghĩa là không có cách nào mã này được thực thi.

Đôi khi bạn thậm chí không thể biên dịch nó (như trường hợp này :)

private Boolean dead_code() 
    { 
    return true; 
    //Dead code below: 
    dosomething(); 
    } 

Nhưng trong những trường hợp khác này không phải là quá rõ ràng, ví dụ như tuyên bố này:

b=true; 
    [...] 
    if (b==false) 
    { 
    //Dead code 
    } 

Nếu bạn có điều này tin nhắn, có một số lỗ hổng lớn trong mã của bạn. Bạn phải tìm nó, nếu không ứng dụng của bạn sẽ không hoạt động như dự định.

+0

Tôi thích ví dụ đầu tiên của bạn, nhưng không đồng ý với "có ** là ** một số lỗ hổng lớn". Điều này không nhất thiết phải như vậy, ví dụ tôi thường sử dụng tham số "boolean" boolean tĩnh sẽ thực thi một số mã chỉ khi tham số được đặt thành true. Đối với các bản phát hành, tôi thay đổi tham số thành false và kết quả là tôi nhận được rất nhiều cảnh báo mã chết vì các phần mã "gỡ lỗi" sẽ không bao giờ được thực hiện. – THelper

+0

Bạn nói đúng, tôi không nghĩ đến trường hợp này. Điều đó thực sự sẽ dẫn đến rất nhiều mã chết. – Force

1

Có hai loại chẩn đoán mà Eclipse đưa ra để đánh dấu mã sẽ/có thể không được thực hiện khi chạy. 1) Mã không thể truy cập: Đây là các cảnh báo java thông thường tuân thủ các quy tắc không thể truy cập của JLS và cũng được cung cấp bởi javac. Đây là những lỗi biên dịch. Ví dụ:

int foo() { 
     return 1; 
     int i = 1; // Unreachable 
    } 
    int foo2() { 
    while (true); 
    int i =1; //Unreachable 
    } 

Có những ví dụ phức tạp hơn khác :)

2) đang chết: Đây là cảnh báo tĩnh phân tích riêng của Eclipse, và chủ yếu gắn ra khỏi phân tích rỗng ví dụ:

void foo() { 
    Object o = null; 
    if (o == null) { 
    } else { 
    // dead code 
    } 

Các ví dụ ở trên KHÔNG nên đưa ra cảnh báo mã chết. tức là

boolean x = true; 
if (x) { 
    // do something 
} else { 
    // this is dead code! 
} 

không nên đưa ra cảnh báo, vì JLS cấm trình biên dịch đánh giá 'giá trị' của biến. Tất cả những gì chúng tôi có thể đánh giá là 'nullness'

Hope this helps

1

Bạn có thể gặp phải một ngoại lệ con trỏ Null trong những dòng phía trên "Dead Code" dòng. Đảm bảo bạn kiểm tra ngoại lệ "Null Pointer".

+0

Tôi cũng sẽ nói: Bạn có thể có một trình biên dịch rõ ràng ngoại lệ con trỏ Null :), tức là một điều kiện nếu mã của bạn chắc chắn sẽ dẫn đến ngoại lệ con trỏ Null trên dòng đã đưa ra cảnh báo đó để ngay cả trình biên dịch hiểu điều này. – XMight

-1

Hãy thử điều này:

while (true) { 
    if(false == true) break; 

} 

S.O.P("I will never reach here!") <-- This code will never be executed. 

Mã này có giá trị vì nó phù hợp với các trình biên dịch, tuy nhiên trong thực tế, vòng lặp sẽ không bao giờ xuất cảnh, và có hiệu lực S.O.P sẽ không bao giờ được thực thi.

0

Có thể bạn đã sử dụng biến số ar trước đây. Sau đó trình biên dịch biết rằng dòng trong câu lệnh khác sẽ không bao giờ được thực hiện. Hoặc sẽ có một NullPointerException tại địa điểm bạn đã sử dụng ar hoặc phần đầu tiên của tuyên bố if sẽ được thực thi.

0

hãy để tôi đưa ra một số câu trả lời cho mã đã chết.

Ví dụ:

public class UnreachableTest{ 

    public static void main(){ 

     try{ 
      // some code 
     } 
     catch(Exception exc){ 
      throw new NullPointerException(); 
      System.out.println("Unreachable line"); // compile time error 
     } 
    } 

} 

đây System.out.println ("Unreachable dòng"); không bao giờ được thực hiện. Mà lần lượt được coi là một mã chết.

Một ví dụ khác có thể là:

int func(int i, int j) 
{ 
int sum = i + j; 
return i + j; // never actually using the sum 
} 

đơn giản trả về chức năng i + j; không bao giờ thực sự sử dụng tổng. Tổng được coi là mã chết ở đây.

0

Một số trường hợp khác khi điều này xảy ra.

System.out.println("result :" + result + ":" + result.isEmpty()); 
if (result == null) 
    return result; 
else if(!result.isEmpty()) 
    str.append(result + " "); 

1) Tại đây bạn đang in kết quả và kiểm tra isEmpty() eclipse giả định rằng kết quả không phải là rỗng nên sẽ không đi vào nếu. Vì vậy, kết quả trả về là mã chết.

2) Bây giờ hãy nói kết quả là đến null do đó bạn sẽ nhận được NullPointerException trong result.isEmpty() để một lần nữa nó sẽ không đi trong khi và trả về kết quả là deadcode

Để thực hiện công việc này chỉ nhận xét ra hệ thống. out.println().

0

Eclipse đưa ra cảnh báo này nếu kiểm tra điều kiện bạn đang đưa ra có thể không bao giờ được thỏa mãn.Sau đây là một số ví dụ

Object o=null; 
if(o!=null) { 
//Some code 

} 

cảnh báo mã ở đây chết sẽ đến như là đối tượng đã được làm rỗng

Một ví dụ khác được đưa ra dưới đây

BSTTest bstTest=null; 
bstTest.test=10; 
if(bstTest==null) { 
    //some code 

} 

Ở đây đang cố gắng truy cập một biến của lớp học. Khi biến đã được truy cập, nhật thực sẽ cho cảnh báo mã chết nếu (bstTest == null) vì bstTest có thể không rỗng khi biến đã được truy cập.

Lưu ý: Đây bstTest.test sẽ cho rỗng trỏ ngoại lệ

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