Tôi đến đây vì tôi cũng gặp phải câu hỏi này trong Lập trình viên đam mê , bởi Chad Fowler. Đối với những người không có quyền truy cập vào một bản sao, câu hỏi được đóng khung như một loại bộ lọc / bài kiểm tra cho các ứng viên phỏng vấn cho một vị trí yêu cầu "lập trình viên Java thực sự giỏi".
Cụ thể, anh hỏi:
Làm thế nào bạn có thể viết một chương trình, bằng Java thuần túy, điều đó sẽ khiến Máy ảo Java gặp sự cố?
Tôi đã lập trình Java trong hơn 15 năm và tôi thấy câu hỏi này vừa khó hiểu vừa không công bằng. Như những người khác đã chỉ ra, Java, như một ngôn ngữ được quản lý, được thiết kế đặc biệt để không gặp sự cố . Tất nhiên luôn có các lỗi JVM, nhưng:
- Sau hơn 15 năm JRE cấp sản xuất, thật hiếm.
- Bất kỳ lỗi nào như vậy có khả năng sẽ được vá trong phiên bản tiếp theo, vậy khả năng bạn là một lập trình viên có thể chạy vào và nhớ lại các chi tiết của bộ trình dừng JRE hiện tại như thế nào?
Như những người khác đã đề cập, một số mã gốc thông qua JNI là một cách chắc chắn để đánh sập JRE. Nhưng tác giả đã đề cập cụ thể trong Java thuần túy , vì vậy đó là ra.
Một tùy chọn khác là cung cấp mã byte không có thật của JRE; đủ dễ dàng để đổ một số dữ liệu nhị phân rác vào tệp. class và yêu cầu JRE chạy nó:
$ echo 'crap crap crap' > crap.class
$ java crap
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1668440432 in class file crap
Có tính không? Ý tôi là bản thân JRE đã không gặp sự cố; nó đã phát hiện đúng mã không có thật, báo cáo và thoát ra.
Điều này cho chúng ta các loại giải pháp rõ ràng nhất như thổi stack qua đệ quy, hết bộ nhớ heap thông qua phân bổ đối tượng hoặc đơn giản là ném RuntimeException
. Nhưng điều này chỉ khiến JRE thoát ra với một StackOverflowError
ngoại lệ hoặc tương tự, một lần nữa, nó không thực sự là một sự cố .
Vậy những gì còn lại? Tôi thực sự thích nghe những gì tác giả thực sự có trong đầu như một giải pháp thích hợp.
Cập nhật : Chad Fowler đã trả lời ở đây .
PS: đó là một cuốn sách tuyệt vời. Tôi nhặt nó lên để hỗ trợ về mặt đạo đức khi học Ruby.