Danh sách các tên cảnh báo @SuppressWarnings hợp lệ trong Java là gì?


264

Danh sách các @SuppressWarningstên cảnh báo hợp lệ trong Java là gì?

Các bit mà ở giữa ("")trong @SuppressWarnings("").


3
Câu hỏi này thực sự hay và câu trả lời rất hữu ích. Nếu ai đó từ JCP nhìn vào nó, bạn sẽ nhận ra nó lộn xộn đến mức nào khi thêm cảnh báo triệt tiêu. Không có quy ước về vỏ, gạch nối, vỏ lạc đà, nó chỉ là một mớ hỗn độn, sẽ rất đáng yêu để chuẩn hóa điều này.
Snicolas

Tôi thấy "ProhibitedExceptionDeclared"trong Khung sưu tập Eclipse ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction) và điều đó không được liệt kê dưới đây.
kevinarpe

Câu trả lời:


250

Nó phụ thuộc vào IDE hoặc trình biên dịch của bạn.

Đây là danh sách cho Eclipse Galileo:

  • tất cả để đàn áp tất cả các cảnh báo
  • quyền anh để ngăn chặn các cảnh báo liên quan đến hoạt động đấm bốc / unboxing
  • diễn viên để ngăn chặn cảnh báo liên quan đến hoạt động đúc
  • dep-ann để ngăn chặn các cảnh báo liên quan đến chú thích không dùng nữa
  • khấu hao để ngăn chặn các cảnh báo liên quan đến khấu hao
  • dự phòng để ngăn chặn các cảnh báo liên quan đến mất tích trong các báo cáo chuyển đổi
  • cuối cùng để ngăn chặn các cảnh báo liên quan đến cuối cùng chặn không quay trở lại
  • ẩn để ngăn chặn các cảnh báo liên quan đến người dân địa phương ẩn biến
  • chuyển đổi không đầy đủ để chặn các cảnh báo liên quan đến các mục bị thiếu trong câu lệnh chuyển đổi (trường hợp enum)
  • nls để ngăn chặn các cảnh báo liên quan đến các chuỗi ký tự không phải nls
  • null để ngăn chặn các cảnh báo liên quan đến phân tích null
  • hạn chế để ngăn chặn các cảnh báo liên quan đến việc sử dụng các tài liệu tham khảo không được khuyến khích hoặc bị cấm
  • nối tiếp để triệt tiêu các cảnh báo liên quan đến trường serialVersionUID bị thiếu đối với một lớp tuần tự hóa
  • truy cập tĩnh để ngăn chặn các cảnh báo liên quan đến truy cập tĩnh không chính xác
  • truy cập tổng hợp để ngăn chặn các cảnh báo liên quan đến truy cập không được tối ưu hóa từ các lớp bên trong
  • không được kiểm tra để ngăn chặn các cảnh báo liên quan đến các hoạt động không được kiểm tra
  • không đủ tiêu chuẩn trường truy cập đến các cảnh báo đàn áp liên quan đến truy cập lĩnh vực không đủ tiêu chuẩn
  • không được sử dụng để ngăn chặn các cảnh báo liên quan đến mã không sử dụng

Danh sách cho Indigo cho biết thêm:

  • javadoc để ngăn chặn các cảnh báo liên quan đến các cảnh báo javadoc
  • rawtypes để ngăn chặn cảnh báo liên quan đến việc sử dụng các loại thô
  • phương thức tĩnh để triệt tiêu các cảnh báo liên quan đến các phương thức có thể được khai báo là tĩnh
  • siêu để ngăn chặn các cảnh báo liên quan đến việc ghi đè một phương thức mà không có siêu dẫn

Danh sách cho Juno cho biết thêm:

  • tài nguyên để ngăn chặn các cảnh báo liên quan đến việc sử dụng các tài nguyên thuộc loại Có thể đóng
  • ghi đè đồng bộ hóa để chặn cảnh báo vì thiếu đồng bộ hóa khi ghi đè phương thức đồng bộ hóa

Kepler và Luna sử dụng cùng một danh sách mã thông báo như Juno ( danh sách ).

Những người khác sẽ tương tự nhưng khác nhau.


Trong trường hợp nào việc ngăn chặn cảnh báo null sẽ hữu ích?
Jesse Jashinsky

@Jlie: Khi trình biên dịch sai (nghĩa là "'Cảnh báo ngu ngốc'). Hãy thử biên dịch : void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. Một số môi trường (ví dụ NetBeans 7.3 w / Java 6 JDK [1.6.0_41]) sẽ tạo ra "o possibly null"tại o.toString()cuộc gọi mặc dù okhông thể rỗng tại thời điểm đó.
par

2
@cletus: Có thể thêm các loại cảnh báo trong nhật thực không? Vấn đề là một trong các thành viên trong nhóm của chúng tôi sử dụng IntelliJ và IDE đó có các loại cảnh báo triệt tiêu khác đưa ra cảnh báo trong Eclipse :) Trong Eclipse Indigo bạn có thể đặt trong các tùy chọn: Bỏ qua các mã thông báo SuppressWarnings chưa sử dụng, nhưng dường như nó không hoạt động ...
KC

semicolondường như không làm việc trong luna? :( Ai đó có thể xác minh nếu semicolonthực sự hợp lệ không?
Kissaki

Giá trị nào để loại bỏ cảnh báo "đồng bộ hóa trên trường không phải là cuối cùng"?
matteo

48

Tất cả các giá trị được cho phép (những giá trị không được công nhận sẽ bị bỏ qua). Danh sách những người được công nhận là trình biên dịch cụ thể.

Trong Hướng dẫn Java uncheckeddeprecationđược liệt kê là hai cảnh báo theo yêu cầu của Đặc tả ngôn ngữ Java, do đó, chúng phải hợp lệ với tất cả các trình biên dịch:

Mỗi cảnh báo trình biên dịch thuộc về một thể loại. Đặc tả ngôn ngữ Java liệt kê hai loại: không dùng nữa và không được chọn.

Các phần cụ thể bên trong Đặc tả ngôn ngữ Java nơi chúng được xác định không nhất quán giữa các phiên bản. Trong Đặc tả Java SE 8 uncheckeddeprecationđược liệt kê dưới dạng cảnh báo trình biên dịch trong các phần 9.6.4.5. @SuppressWarnings9.6.4.6 @Deprecated , tương ứng.

Đối với trình biên dịch của Sun, việc chạy javac -Xđưa ra một danh sách tất cả các giá trị được phiên bản đó nhận ra. Đối với 1.5.0_17, danh sách có vẻ là:

  • tất cả
  • khấu hao
  • không được kiểm tra
  • thất bại
  • con đường
  • nối tiếp
  • cuối cùng

43

Danh sách này là trình biên dịch cụ thể. Nhưng đây là các giá trị được hỗ trợ trong Eclipse :

  • khấu hao toàn bộ ngay cả bên trong mã không dùng nữa
  • allJavadoc không hợp lệ hoặc thiếu javadoc
  • assertIdentifier xuất hiện của assert được sử dụng làm định danh
  • chuyển đổi tự động đấm bốc
  • charConcat khi một mảng char được sử dụng trong nối chuỗi mà không được chuyển đổi rõ ràng thành chuỗi
  • conditionAssign có thể vô tình gán boolean
  • Phương thức constructorName với tên constructor
  • dep-ann thiếu chú thích @Deprecated
  • sử dụng khấu hao của loại không dùng nữa hoặc thành viên bên ngoài mã không dùng nữa
  • không khuyến khích sử dụng các loại khớp với quy tắc truy cập không được khuyến khích
  • blankBlock khối trống không có giấy tờ
  • enumSwitch , công tắc enum chưa hoàn thành
  • fallthrough trường hợp fallthrough thể
  • fieldHiding lĩnh vực giấu biến khác
  • tham số loại FinalBound với ràng buộc cuối cùng
  • cuối cùng khối không hoàn thành bình thường
  • cấm sử dụng các loại khớp với quy tắc truy cập bị cấm
  • ẩn macro cho fieldHiding, localHiding, typeHiding và maskedCatchBlock
  • gián tiếp Tham chiếu gián tiếp đến thành viên tĩnh
  • loại chú thích intfAnnotation được sử dụng như siêu giao diện
  • Giao diện intfNonInherited không tương thích phương thức
  • javadoc không hợp lệ javadoc
  • localHiding biến cục bộ ẩn một biến khác
  • maskedCatchBlocks ẩn khối bắt
  • nls chuỗi ký tự không phải nls (thiếu thẻ // $ NON-NLS-)
  • Bài tập noEffectAssign không có hiệu lực
  • null tiềm năng thiếu hoặc kiểm tra null dự phòng
  • nullDereference thiếu kiểm tra null
  • quá ann thiếu chú thích @Override
  • gán paramAssign cho một tham số
  • pkgDefaultMethod cố gắng ghi đè phương thức mặc định gói
  • sử dụng thô a loại thô (thay vì loại tham số)
  • dấu chấm phẩy không cần thiết dấu chấm phẩy hoặc câu lệnh trống
  • thiếu nối tiếp serialVersionUID
  • constructor SpecialParamHiding hoặc tham số setter ẩn trường khác
  • macro truy cập tĩnh cho gián tiếpStatic và staticReceiver
  • staticReceiver nếu một máy thu không tĩnh được sử dụng để lấy trường tĩnh hoặc gọi một phương thức tĩnh
  • siêu ghi đè một phương thức mà không thực hiện một lời gọi siêu
  • triệt tiêu kích hoạt @SuppressWarnings
  • tổng hợpAccess, truy cập tổng hợp khi thực hiện truy cập tổng hợp cho innerclass
  • tác vụ cho phép hỗ trợ cho các thẻ tác vụ trong mã nguồn
  • typeHiding tham số loại ẩn loại khác
  • loại bỏ hoạt động không được kiểm tra
  • không cần thiết
  • không đủ tiêu chuẩn truy cập trường, không đủ tiêu chuẩnField tham chiếu không đủ tiêu chuẩn đến trường
  • macro không được sử dụng cho không sử dụngArgument, không sử dụngImport, không sử dụngLabel, không sử dụngLocal, không sử dụngPrivate và không sử dụngThrown
  • không sử dụngArgument đối số phương thức không sử dụng
  • unusedImport tham khảo nhập khẩu chưa sử dụng
  • unusedLabel nhãn chưa sử dụng
  • unusedLocal biến địa phương chưa sử dụng
  • unusePrivate khai báo thành viên tư nhân không sử dụng
  • unusedThrown không sử dụng ngoại lệ ném tuyên bố
  • uslessTypeCheck hoạt động cast / instanceof không cần thiết
  • đối số varargsCast varargs cần cast rõ ràng
  • cảnh báo Mã thông báo cảnh báo chưa được xử lý trong @SuppressWarnings

Sun JDK (1.6) có một danh sách ngắn hơn các cảnh báo được hỗ trợ:

  • deprecation Kiểm tra để sử dụng các mặt hàng giảm giá.
  • không được kiểm tra Cung cấp thêm chi tiết cho các cảnh báo chuyển đổi không được kiểm tra được ủy quyền bởi Đặc tả ngôn ngữ Java.
  • Cảnh báo nối tiếp về các định nghĩa serialVersionUID bị thiếu trên các lớp tuần tự hóa.
  • cuối cùng Cảnh báo về các mệnh đề cuối cùng không thể hoàn thành bình thường.
  • dự phòng Kiểm tra các khối chuyển đổi cho các trường hợp rơi và cung cấp một thông báo cảnh báo cho bất kỳ trường hợp nào được tìm thấy.
  • đường dẫn Kiểm tra đường dẫn không tồn tại trong đường dẫn môi trường (như đường dẫn lớp).

Javac mới nhất có sẵn (1.6.0_13) cho mac có các cảnh báo được hỗ trợ sau

  • tất cả
  • diễn viên
  • khấu hao
  • divzero
  • trống
  • không được kiểm tra
  • thất bại
  • con đường
  • nối tiếp
  • cuối cùng
  • ghi đè

Danh sách Eclipse ở đây xem các cờ trình biên dịch chứ không phải các chú thích SuppressWarning (kiểm tra phần cuối của tài liệu bạn đã liên kết).
Ron Tuffin

3
Họ là cả hai. Bằng cách đặt cờ trình biên dịch, bạn báo cho trình biên dịch loại cảnh báo nào bạn muốn. Với các chú thích, bạn có thể chặn các cảnh báo này ở những vị trí cụ thể trong mã của mình.
D. Classicalblewski

Tôi nghĩ rằng danh sách này ngắn hơn cho Eclipse. Xem tài liệu galileo mới nhất, danh sách các thẻ có sẵn cho SupressWarnings là rõ ràng có: help.eclipse.org/galileo/index.jsp?topic=/...
Peter Štibraný

2
Tôi đã thử @SuppressWarnings ("raw") trong Eclipse 3.5 và nó không hoạt động - Tôi nhận được một cảnh báo rằng nó "thô" không phải là một giá trị hợp lệ cho chú thích này.
Jesper

tôi cũng vậy. Thật không may là hỗ trợ jsp không bị tuôn ra như hỗ trợ java.
stu

9

Một yêu thích mới đối với tôi là @SuppressWarnings("WeakerAccess")trong IntelliJ, giúp nó không phàn nàn khi nó nghĩ rằng bạn nên có một công cụ sửa đổi truy cập yếu hơn so với bạn đang sử dụng. Chúng tôi phải có quyền truy cập công khai cho một số phương pháp để hỗ trợ thử nghiệm và @VisibleForTestingchú thích không ngăn được các cảnh báo.

ETA: "Chưa xác định" đã nhận xét, trên trang @MattCampbell được liên kết đến, lưu ý cực kỳ hữu ích sau:

Bạn không cần phải sử dụng danh sách này cho mục đích bạn đang mô tả. IntelliJ sẽ tự động thêm các SuppressWarnings cho bạn nếu bạn yêu cầu. Nó đã có khả năng làm điều này cho nhiều bản phát hành trở lại như tôi nhớ.

Chỉ cần đi đến vị trí mà bạn có cảnh báo và nhập Alt-Enter (hoặc chọn nó trong danh sách Kiểm tra nếu bạn thấy nó ở đó). Khi menu xuất hiện, hiển thị cảnh báo và đề nghị sửa nó cho bạn (ví dụ: nếu cảnh báo là "Phương thức có thể tĩnh" thì "tạo tĩnh" là đề nghị của IntellJ để sửa lỗi cho bạn), thay vì chọn "enter", chỉ cần sử dụng nút mũi tên phải để truy cập menu con, sẽ có các tùy chọn như "Chỉnh sửa cài đặt hồ sơ kiểm tra", v.v. Ở dưới cùng của danh sách này sẽ là các tùy chọn như "Bỏ qua tất cả các kiểm tra cho lớp", "Bỏ qua cho lớp", "Bỏ qua cho phương thức" và đôi khi là "Bỏ qua cho câu lệnh". Bạn có thể muốn bất kỳ một trong số này xuất hiện cuối cùng trong danh sách. Chọn một trong số này sẽ thêm chú thích @SuppressWarnings (hoặc nhận xét trong một số trường hợp) vào mã của bạn để loại bỏ cảnh báo được đề cập. Bạn sẽ không cần đoán thêm chú thích nào, bởi vì IntelliJ sẽ chọn dựa trên cảnh báo bạn đã chọn.


2

Tôi nhận thấy rằng //noinspectioncó thể được tạo tự động trong IntelliJ

  • đảm bảo bạn chưa có kế hoạch @SuppressWarninigstrước tuyên bố
  • Bây giờ bạn có thể tự động tạo cụ thể //noinspectionbằng cách nhấn Alt + Enter khi bạn đã chọn cảnh báo và sau đó sử dụng phím mũi tên phải để xem tùy chọn Bỏ qua cho ...

Đã kết thúc ở đây khi tôi muốn loại bỏ cảnh báo "công tắc có quá ít nhãn trường hợp" từ IntelliJ. Tôi không tìm thấy Danh sách đầy đủ cho @SuppressWarninghỗ trợ của IntelliJ nhưng //noinspectionđã lừa tôi.


Bạn cũng có thể thêm @SuppressWarnings ("SwitchStatementWithTooFewBranches").
JPM

Thật không may, tùy chọn
Supress

//noinspection SwitchStatementWithTooFewBranchestrước khi switchlàm việc tốt cho tôi
Oliver Hausler

1

Và đây dường như là một danh sách đầy đủ hơn nhiều, nơi tôi đã tìm thấy một số cảnh báo cụ thể cho Android-Studio mà tôi không thể tìm thấy ở nơi nào khác (ví dụ: SyncizeOnNonFinalField)

https://jazzy.id.au/2008/10/30/list_of_suppresswarnings_argument.html

Ồ, bây giờ hướng dẫn của SO chống lại các hạn chế của SO. Một mặt, tôi phải sao chép danh sách thay vì chỉ cung cấp liên kết. Nhưng mặt khác, điều này sẽ vượt quá số lượng ký tự tối đa được phép. Vì vậy, hãy hy vọng liên kết sẽ không bị hỏng.


1

Mã 1.7

Tài liệu Oracle đề cập:

  • unchecked: Các cảnh báo không được kiểm tra được xác định bởi chuỗi "không được kiểm tra".
  • deprecation: Trình biên dịch Java phải tạo cảnh báo khấu hao khi một loại, phương thức, trường hoặc hàm tạo có khai báo được chú thích với chú thích @Deprecated được sử dụng (nghĩa là ghi đè, gọi hoặc tham chiếu theo tên), trừ khi: [...] sử dụng là trong một thực thể được chú thích để chặn cảnh báo với chú thích @SuppressWarnings ("deprecation"); hoặc là

Sau đó, nó giải thích rằng việc triển khai có thể thêm và ghi lại tài liệu của riêng họ:

Các nhà cung cấp trình biên dịch nên ghi lại các tên cảnh báo mà họ hỗ trợ kết hợp với loại chú thích này. Các nhà cung cấp được khuyến khích hợp tác để đảm bảo rằng các tên giống nhau hoạt động trên nhiều trình biên dịch.


1
Đó không phải là sự thật uncheckedduy nhất được chứng thực bởi tiêu chuẩn; phần tiếp theo từ phần bạn trích dẫn nói rằng không nên đưa ra cảnh báo @SuppressWarnings("deprecation")
khấu hao

1

Tôi chỉ muốn thêm rằng có một danh sách chính các tham số triệt tiêu IntelliJ tại: https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

Nó trông khá toàn diện. Một phần:

Warning Description - Warning Name

"Magic character" MagicCharacter 
"Magic number" MagicNumber 
'Comparator.compare()' method does not use parameter ComparatorMethodParameterNotUsed 
'Connection.prepare*()' call with non-constant string JDBCPrepareStatementWithNonConstantString 
'Iterator.hasNext()' which calls 'next()' IteratorHasNextCallsIteratorNext 
'Iterator.next()' which can't throw 'NoSuchElementException' IteratorNextCanNotThrowNoSuchElementException 
'Statement.execute()' call with non-constant string JDBCExecuteWithNonConstantString 
'String.equals("")' StringEqualsEmptyString 
'StringBuffer' may be 'StringBuilder' (JDK 5.0 only) StringBufferMayBeStringBuilder 
'StringBuffer.toString()' in concatenation StringBufferToStringInConcatenation 
'assert' statement AssertStatement 
'assertEquals()' between objects of inconvertible types AssertEqualsBetweenInconvertibleTypes 
'await()' not in loop AwaitNotInLoop 
'await()' without corresponding 'signal()' AwaitWithoutCorrespondingSignal 
'break' statement BreakStatement 
'break' statement with label BreakStatementWithLabel 
'catch' generic class CatchGenericClass 
'clone()' does not call 'super.clone()' CloneDoesntCallSuperClone

1

Nếu bạn đang sử dụng SonarLint, hãy thử ở trên phương thức hoặc lớp toàn bộ chuỗi mực: @SuppressWarnings ("squid: S1172")

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.