2015-07-28 14 views
6

Tôi đang tìm định nghĩa về các phần xảy ra xung quanh lambda trong dấu vết ngăn xếp Java 8

Ví dụ: mã này

Object inputData = someData(); 

myList.stream().forEach(listItem -> { 

    Query query = (Query) listItem.getSingle().apply(this.getId()); 

    Object data = diffUtils.applyProjection(query, inputData); 

    myStringCollection.stream() 
     .filter(destination -> myPredicateMethod(listItem, destination)) 
     .forEach(destination -> myProcessMethod(destination, data)); 
} 

đôi khi tạo ngoại lệ này.

at [CLASS].lambda$null$2([CLASS].java:85) 
at [CLASS]$$Lambda$64/730559617.accept(Unknown Source) 

Các phần khác nhau mô tả trong ngoại lệ là gì? "Null", "2", "64", "730559617" và "Nguồn không xác định" cho tôi biết điều gì?

Ví dụ chi tiết hơn có thể tìm thấy ở đây (nhưng ở đây "null" trong ngoại lệ của tôi ở trên không có mặt). http://blog.takipi.com/the-dark-side-of-lambda-expressions-in-java-8/

+0

Bản sao có thể có của [Nhận dạng lambdas trong stacktrace trong Java 8] (http://stackoverflow.com/questions/29435888/identifying-lambdas-in-stacktrace-in-java-8) –

Trả lời

3

Không có định nghĩa chuẩn nào cho tên lớp được tạo này. Điều này là có chủ ý để tránh bạn viết mã mà phụ thuộc vào nó làm cho nó khó khăn hơn cho các nhà thiết kế để thay đổi nó sau này.

Điều đó đang được nói, những gì bạn có thể đọc được là;

  • phần đầu tiên của tên lớp là lớp của trang web cuộc gọi.
  • số trước $ mới nhất là bộ đếm toàn cầu cho lambda. Điều này phụ thuộc vào thứ tự trong đó mã cho lambdas được tạo ra.
  • số lớn là id được tạo. Nó là khác nhau cho cùng một lambda mỗi khi bạn chạy nhưng không thay đổi một khi bạn đã bắt đầu.

"Nguồn không xác định" cho bạn biết mã được tạo này không có thông tin gỡ lỗi được liên kết với nó.

Chúng tôi đang xem thư viện để thay đổi toString cho lambda để cung cấp cho bạn ý tưởng về mã được liên kết với nó. tức là nó sẽ giống như mã của lambda ít nhất là cho các trường hợp tầm thường.

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