2011-11-16 24 views
10

tôi đã thực hiện một ứng dụng mà mất tập tin elf (* a, * .o.) Và đưa ra danh sách các tên phương pháp, nhưng nếu ai đó đặt lại tên bất kỳ tập tin vào * .a hoặc * .o sau đó nó sẽ hiển thị:Cách bắt java.lang.NoClassDefFoundError?

Exception occurred during event dispatching: 
java.lang.NoClassDefFoundError: org/eclipse/core/resources/IWorkspaceRunnable 
    at org.eclipse.cdt.utils.AR.<init>(AR.java:237) 
    at com.lge.windowELF.ElfBinaryArchive.<init>(ElfBinaryArchive.java:24) 
    at com.lge.windowELF.ELFParserLibraryFile.createBinaryArchive(ELFParserLibraryFile.java:230) 
    at com.lge.windowELF.ELFParserLibraryFile.<init>(ELFParserLibraryFile.java:46) 
    at com.lge.windowELF.ELFWrapper.<init>(ELFWrapper.java:36) 
    at com.lge.windowELF.ELF_UIIntegrated.actionPerformed(ELF_UIIntegrated.java:510) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 

Trong trường hợp này, tôi muốn đưa ra một số thông điệp cảnh báo. Ngoại lệ này không bị bắt bởi try/catch.

+0

Tìm tệp JAR chứa giao diện hoặc lớp 'IWorkspaceRunnable'. Nó có trong classpath của bạn không? –

+0

có thể trùng lặp của [Khi nào bắt java.lang.Error?] (Http://stackoverflow.com/questions/352780/when-to-catch-java-lang-error) – adatapost

+0

nó có thể bị bắt bằng cách bắt lỗi cụ thể này hoặc 'Throwable'. nhưng có thể bạn nên xử lý tình trạng thiếu tập tin trong mã của mình một cách thanh lịch hơn ... – aishwarya

Trả lời

4

Đó là không được khuyến khích để bắt một số Error! bang javadoc:

Một Error là một lớp con của Throwable cho biết vấn đề nghiêm trọng mà một ứng dụng hợp lý không nên cố gắng nắm bắt.

Đề xuất của tôi là bạn sắp xếp ra NoClassDefFoundError và lo lắng về các trường hợp ngoại lệ được mã của bạn thay thế.

Tôi muốn, bằng mã, hãy ném InvalidELFFileException (phỏng đoán được giáo dục) trên ElfBinaryArchive lớp nhà xây dựng (hoặc quấn lớp và làm throws khi khởi tạo) khi lớp cố gắng mở tệp ELF. Bằng cách đó, nếu có một tập tin ELF không hợp lệ, một ngoại lệ khá được ném ra.

Cách khác, đảm bảo rằng org.eclipse.core.resources.IWorkspaceRunnable phải được đặt trong CLASSPATH.

+15

Downvote vì __should not__ không giống như __must not__ hoặc __never__, không nên có nghĩa là nó được cho phép, không được khuyến khích. Và nếu ai đó hỏi "_Làm thế nào tôi làm điều gì đó? _", Nói chung là không hữu ích khi nói "_Chỉ cần đừng làm điều đó_"; Tôi thậm chí còn xem xét rằng thô lỗ, ngay cả khi câu trả lời của bạn có thể hữu ích. – Mecki

+5

Tôi không bao giờ biết rằng chúng tôi đang downvoting dựa trên việc sử dụng ngôn ngữ tiếng Anh. Tôi nghĩ SO dựa trên các giải pháp liên quan đến lập trình. Nếu điều này được dựa trên ngôn ngữ tiếng Anh thì không nên đăng bài này có lợi hơn trên tiếng Anh StackExchange? (Xem [ví dụ] (http://english.stackexchange.com/questions/56065/must-not-or-may-not-which-is-the-most-correct)). –

+1

Một người dùng hỏi bạn làm thế nào để làm điều gì đó và bạn nói với anh ta rằng anh ta sẽ không làm điều đó, đó là lý do tại sao bạn bị downvoted. Bạn sẽ không làm điều đó là __no trả lời cho câu hỏi__. – Mecki

43

NoClassDefFoundError là lớp con của Error chứ không phải là Exception. Do đó bạn cần sử dụng:

try { 
    new org.eclipse.cdt.utils.AR(); 
} 
catch(NoClassDefFoundError e) { 
    //handle carefully 
} 

trong mã của bạn. Lưu ý rằng bạn không bao giờ nên bắt được Error hoặc Throwable. Ngoài ra hãy chắc chắn rằng bạn bao quanh càng ít mã càng tốt với điều này catch vì ngoại lệ này không nên thường bị bắt.

CẬP NHẬT: Bạn cũng có chắc chắn muốn bắt ngoại lệ này không? Nó rất hiếm và tôi không thể tưởng tượng làm thế nào để bạn muốn xử lý nó. Có lẽ bạn chỉ cần thêm một JAR với lớp học IWorkspaceRunnable vào CLASSPATH của bạn?

+2

Câu trả lời này tốt hơn nhiều, nó phải được chấp nhận vì nó thực sự thực sự trả lời câu hỏi và đồng thời giúp giải quyết vấn đề thực sự. – Mecki

+1

Có thể là một tình huống khi bạn có thể muốn bắt nó. Khi bạn triển khai lại ứng dụng trong vùng chứa ứng dụng web. Sau đó, có một phiên lắng nghe người nghe và ở đó nó cố gắng tìm một lớp mà không phải là trên classpath nữa vì nó đã được undeployed.? – ACV

+0

đây là tình huống: tôi có bình yêu cầu trong classpath của tôi nhưng tôi phân phối mã cho những người có thể không và muốn đảm bảo họ biết cách thêm nó khi họ cố gắng chạy nó – Luke

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