2015-02-12 20 views
6

Tôi đang đọc là nguồn gốc của XWalkUIClientInternal và tôi chạy vào đoạn mã sau:khẳng định (sai) so với RuntimeException?

switch(type) { 
     case JAVASCRIPT_ALERT: 
      return onJsAlert(view, url, message, result); 
     case JAVASCRIPT_CONFIRM: 
      return onJsConfirm(view, url, message, result); 
     case JAVASCRIPT_PROMPT: 
      return onJsPrompt(view, url, message, defaultValue, result); 
     case JAVASCRIPT_BEFOREUNLOAD: 
      // Reuse onJsConfirm to show the dialog. 
      return onJsConfirm(view, url, message, result); 
     default: 
      break; 
    } 
    assert(false); 
    return false; 

Tôi chưa bao giờ thực sự nhìn thấy kỹ thuật này cũng không thực sự nghĩ về nó trước đây, nhưng tôi đoán này về cơ bản có nghĩa là "đây là unreachable mã và không nên xảy ra bao giờ ", và sụp đổ các ứng dụng không có vấn đề gì. Mặc dù kỹ thuật bạn có thể làm điều đó với một Throwable, miễn là nó không bị bắt.

Vì vậy, câu hỏi của tôi là, cái nào tốt hơn và tại sao, assert(false) hoặc ném RuntimeException hoặc có thể là Error?

Trả lời

9

Sự khác biệt lớn nhất giữa

assert false; 

(Các ngoặc không cần thiết, assert không phải là một chức năng nhưng một tuyên bố.) Và

throw new RuntimeException(); 

là sự khẳng định có thể bị vô hiệu. Trên thực tế, nó bị tắt theo mặc định trừ khi JVM được bắt đầu với cờ -ea (“bật xác nhận”). Nếu xác nhận được bật, assert false sẽ vô tình ném một số AssertionError xuất phát từ Error. Nhưng kể từ khi khẳng định có thể bị vô hiệu hóa, có hai vấn đề,

  • các lỗi có thể không bị phát hiện và
  • phân tích dòng điều khiển đòi hỏi một return tuyên bố giả sau khi assert (mà chủ yếu là lộn xộn).

Do đó, trong trường hợp trên, tôi muốn chắc chắn đi với một rõ ràng (và ngắn gọn hơn)

throw new AssertionError("invalid type " + type); 

thay vì một assert theo sau là một hình nộm return.

Như đã đề cập trong các nhận xét, giả định rằng type là thông số nội bộ và giá trị không hợp lệ cho biết lỗi trong chính lôgic đó. Nếu nó là một tham số đầu vào, nó phải được xác nhận theo các quy tắc thông thường và một IllegalArgumentException được ném nếu xác nhận không thành công.

+0

Và nếu bạn muốn ném một cái gì đó, bạn sẽ ném một 'RuntimeException' để thậm chí không' bắt (Exception e) 'sẽ bắt nó, hoặc một phân lớp của' Lỗi'? – EpicPandaForce

+1

Bạn có thể ném một 'AssertionError', đó có lẽ là thích hợp nhất. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. – 5gon12eder

+0

Vâng, bạn nói đúng, điều đó dường như là cách tiếp cận tốt nhất. Nó có nhiều thông tin hơn là 'Assertion failed: false', và không bị bắt bởi một nhánh' catch (Exception e) '. – EpicPandaForce

1

Tiếp theo Oracle guidelines (Programming with assertions), khẳng định được thiết kế cho mục đích thử nghiệm:

Một khẳng định là một tuyên bố bằng ngôn ngữ lập trình Java mà cho phép bạn kiểm tra các giả định của bạn về chương trình của bạn. Ví dụ: nếu bạn viết một phương pháp tính toán tốc độ của hạt, bạn có thể khẳng định rằng tốc độ được tính nhỏ hơn tốc độ của ánh sáng.

Mỗi xác nhận có biểu thức boolean mà bạn tin rằng sẽ là đúng khi xác nhận thực thi. Nếu không đúng, hệ thống sẽ ném lỗi. Bằng cách xác minh rằng biểu thức boolean thực sự là đúng, xác nhận xác nhận giả định của bạn về hành vi của chương trình của bạn, tăng sự tự tin của bạn rằng chương trình không bị lỗi .

Trong ví dụ của bạn, nhà phát triển cho rằng mã không bao giờ đạt đến tuyên bố assert. Nếu, hiếm khi xảy ra, assert(false) sẽ ném một số Error (vì nó không bao giờ nên đến đó). Điều này đã được thực hiện cho mục đích thử nghiệm. Vì vậy, sử dụng khẳng định hoàn toàn cho mục đích thử nghiệm.

+0

Nếu nó cho mục đích thử nghiệm, tại sao một thử nghiệm đơn vị \t @Test \t public void test() \t { \t \t phương pháp(); \t} \t tin phương pháp void() \t { \t \t khẳng định sai: "Crash tôi"; \t} vượt qua? –

+0

@ ᵺṓᵯᶏᵴ, bạn đang đề cập đến JUnit 'assertFalse()' hoặc java cụ thể 'assert'? 'AssertFalse' của JUnit xác nhận rằng 'điều kiện' là' false' để truyền một giá trị 'false'. Tôi không đề cập đến' assertFalse' của JUnit hoặc 'assertFalse' của Java, mà đúng hơn là' assert' của Java. –

+0

Tôi không sử dụng 'assertFalse()' trong mã của mình. Tôi đã sử dụng 'khẳng định sai'. –

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