2010-08-04 27 views
22

Tôi đang cố gắng để ném một ngoại lệ trong mã của tôi như thế này:Làm thế nào để vứt RuntimeException ("không thể tìm thấy biểu tượng")

throw RuntimeException(msg); 

Nhưng khi tôi xây dựng trong NetBeans tôi nhận được lỗi này:

C:\....java:50: cannot find symbol 
symbol : method RuntimeException(java.lang.String) 
location: class ... 
     throw RuntimeException(msg); 
1 error 

Tôi có cần nhập gì đó không? Tôi có viết sai chính tả không? Tôi chắc rằng tôi phải làm điều gì đó ngu ngốc :-(

+3

Tại sao bạn muốn ném RuntimeException? –

+6

@JonathonFaust - Bởi vì đôi khi bạn không muốn tự xử lý ngoại lệ, cũng như không muốn buộc người dùng của bạn xử lý ngoại lệ. Nhưng nếu không ai xử lý nó, ứng dụng sẽ bị lỗi. Trong Python, gần như mọi ngoại lệ là một ngoại lệ thời gian chạy, và mọi người đều thích nó. Nếu bạn biết cách xử lý ngoại lệ, bạn xử lý nó, và nếu không, thì bạn bỏ qua nó - hoặc ai đó ở trên bạn có thể xử lý nó hoặc bạn sẽ gặp sự cố, và cả hai trường hợp đều ổn. Điều duy nhất không tốt là ghi lại nó và bỏ qua nó. – ArtOfWarfare

+0

Đừng ném một ngoại lệ thời gian chạy hoặc tạo một lớp con của RuntimeException đơn giản chỉ vì bạn không muốn bị làm phiền với việc xác định các ngoại lệ mà các phương thức của bạn có thể ném. http://journals.ecs.soton.ac.uk/java/tutorial/java/exceptions/runtime.html –

Trả lời

84

throw new RuntimeException(msg)

Bạn cần new trong đó. Điều này tạo ra một thể hiện và ném nó, chứ không phải gọi một phương thức.

+1

Tại sao một người muốn ném một RuntimeException? Thế giới điên rồ ... – PedroD

+0

@PedroD \t Vì ngoại lệ đã kiểm tra là một thử nghiệm không thành công? Hay bạn đang hỏi tại sao một người nào đó muốn ném một * raw * 'RuntimeException' thay vì một lớp con hợp lý? –

+0

Không, không, ngoại lệ đã kiểm tra sẽ là loại duy nhất bạn có thể sử dụng. Chúng là một phần của API bạn đang tạo/xác định. Các ngoại lệ không được kiểm soát nên được dành riêng cho các lỗi hệ thống không thể/không nên được phục hồi (như NullPointer hoặc OutOfMemory). Ví dụ. Nếu tôi có một hàm phân tích cú pháp một số từ một chuỗi, nó sẽ ném cho tôi một ** CheckFormatException ** được kiểm tra **, vì dự kiến ​​rằng hàm này có thể thất bại vì lý do đó và hoàn toàn hợp lý là tôi có thể bắt và phục hồi từ đó lỗi, do đó, nó nên được kiểm tra ... Tuy nhiên nếu tôi nhận được một con trỏ Null ... – PedroD

4
throw new RuntimeException(msg); // notice the "new" keyword 
33

Một Exception là một Object giống như bất kỳ khác trong Java. bạn cần phải sử dụng các từ khóa new để tạo ra một mới Exception trước khi bạn có thể throw nó.

throw new RuntimeException(); 

tùy ý bạn cũng có thể làm như sau:

RuntimeException e = new RuntimeException(); 
throw e; 

Cả hai đoạn mã là tương đương.

Link to the tutorials for completeness.

3

Bạn cần phải tạo ra các thể hiện của các RuntimeException, sử dụng new giống như cách bạn sẽ tạo ra một thể hiện của hầu hết các lớp khác:

throw new RuntimeException(msg); 
6

bạn sẽ phải khởi tạo nó trước khi bạn ném nó

throw new RuntimeException(arg0) 

PS: Chắc chắn đủ Netbeans IDE nên có đã sẵn sàng chỉ ra rằng lỗi thời gian biên dịch

+1

Tại sao các downvotes? +1 để chống lại chúng. –

15

Như mọi người khác đã nói, khởi tạo đối tượng trước khi ném nó.

Chỉ muốn thêm một bit; nó là cực kỳ phổ biến để ném một RuntimeException. Nó sẽ là bình thường đối với mã trong API để ném một lớp con của điều này, nhưng thông thường, mã ứng dụng sẽ ném ngoại lệ, hoặc một cái gì đó kéo dài ngoại lệ nhưng không phải là RuntimeException.

Và nhìn lại, tôi đã bỏ lỡ thêm lý do lý do tại sao bạn sử dụng Ngoại lệ thay vì RuntimeException; @Jay, trong bình luận dưới đây, thêm vào trong bit hữu ích. RuntimeException không phải là ngoại lệ được kiểm tra;

  • Chữ ký phương thức không phải khai báo rằng RuntimeException có thể bị ném.
  • Người gọi phương thức đó không bắt buộc phải ngoại lệ hoặc công nhận nó theo bất kỳ cách nào.
  • Nhà phát triển cố gắng sử dụng sau mã của bạn sẽ không lường trước được vấn đề này trừ khi họ xem xét cẩn thận và sẽ làm tăng gánh nặng bảo trì của mã.
+1

Ditto. Nói chung, bạn nên tạo ngoại lệ của riêng mình để ném và kế thừa chúng từ Ngoại lệ. RuntimeException nên được sử dụng hết sức cẩn thận vì nó bỏ qua các đảm bảo bình thường trong Java mà hàm phải khai báo tất cả các ngoại lệ mà nó có thể ném. – Jay

+0

Một trường hợp phổ biến để thực hiện việc này là nếu bạn đang triển khai giao diện hiện tại không khai báo bất kỳ ngoại lệ đã kiểm tra nào. Ví dụ, viết một bộ nhớ cache được mạng hỗ trợ, nó có ý nghĩa để thực hiện 'Map' - nhưng nếu bạn nhận được một' IOException' khi xử lý một 'put()' hoặc 'get()', bạn sẽ phải ném một số loại RuntimeException. (Nó phải là một lớp tùy chỉnh của nó, nhưng nó sẽ phải là một ngoại lệ không được kiểm soát). –

1

Chỉ cho những người khác: hãy chắc chắn đó là RuntimeException mới, không phải RuntimeErrorException mới cần lỗi làm đối số.

1
throw new RuntimeException(msg); 

không giống như bất kỳ ngoại lệ nào khác tôi nghĩ RuntimeException là chương trình duy nhất không chặn chương trình nhưng vẫn có thể tiếp tục chạy và khôi phục chỉ in ra một loạt các dòng ngoại lệ? đúng nếu tôi đã sai lầm.

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