Java에서 유효한 @SuppressWarnings 경고 이름 목록은 무엇입니까?


264

@SuppressWarningsJava에서 유효한 경고 이름 목록은 무엇입니까 ?

사이에 제공되는 비트 ("")에서 @SuppressWarnings("").


3
이 질문은 정말 좋고 답변이 유용합니다. JCP의 누군가가 그것을 보면, 억제 경고를 추가하는 것이 얼마나 지저분하다는 것을 알아야합니다. 케이스, 하이픈, 낙타 케이스에 대한 규칙이 없으며, 단지 평범한 혼란입니다. 표준화하는 것이 좋을 것입니다.
Snicolas

"ProhibitedExceptionDeclared"Eclipse Collections Framework ( org.eclipse.collections.impl.block.function.checked.ThrowingFunction) 내에서 볼 수 있으며 아래에 나열되어 있지 않습니다.
kevinarpe

답변:


250

IDE 또는 컴파일러에 따라 다릅니다.

Eclipse Galileo 의 목록 은 다음과 같습니다 .

  • 모든 경고를 표시하지 않습니다
  • 권투 / 박스 해제 작업과 관련된 경고를 표시하지 않는 권투
  • 캐스트 작업과 관련된 경고를 표시하지 않는 캐스트
  • 더 이상 사용되지 않는 주석과 관련된 경고를 표시하지 않는 dep-ann
  • 지원 중단 과 관련하여 경고를 표시하지 않는 지원 중단
  • 위해 fallthrough switch 문에없는 틈을 기준으로 억제하는 경고
  • 마지막 으로 반환되지 않는 finally 블록과 관련된 경고를 표시하지 않습니다.
  • 숨어 지역 주민들이 상대적 억제 경고를 숨기기 변수
  • 불완전한 스위치 스위치 문에서 누락 된 항목과 관련된 경고를 표시하지 않음 (열 경우)
  • nls 가 아닌 문자열 리터럴과 관련된 경고를 억제하는 nls
  • null 분석과 관련된 경고를 표시하지 않으려면 null
  • 권장하지 않거나 금지 된 참조의 사용과 관련하여 경고를 억제하는 제한
  • serializable 클래스에 대한 serialVersionUID 필드가 누락되어 경고를 표시하지 않는 serial
  • 정전기에 액세스 잘못된 정적 액세스를 기준으로 억제 경고에
  • 내부 클래스의 최적화되지 않은 액세스와 관련된 경고를 억제하는 합성 액세스
  • 확인되지 않은 작업과 관련된 경고를 표시하지 않으려면 확인하지 않음
  • 규정되지 않은 필드 액세스 권한이없는 필드 액세스와 관련된 경고를 표시하지 않는
  • 사용하지 않는 코드와 관련된 경고를 표시 하지 않으려면 사용되지 않음

인디고 추가 목록 :

  • javadoc 경고와 관련된 경고를 억제하는 javadoc
  • rawtypes 상대 원시 타입의 사용을 억제 경고에
  • static 으로 선언 될 수있는 메소드와 관련하여 경고를 표시하지 않는 static 메소드
  • 수퍼 호출없이 메소드를 대체 할 때 경고를 표시하지 않는 수퍼

Juno 추가 목록 :

  • 자원 유형 닫기 가능한의 자원의 사용을 기준으로 억제 경고에
  • 동기화 된 메소드를 대체 할 때 동기화 누락으로 인해 경고를 표시하지 않는 동기화 대체

Kepler 및 Luna는 Juno ( list ) 와 동일한 토큰 목록을 사용합니다 .

다른 것들은 비슷하지만 다양 할 것입니다.


null 경고를 억제하는 것이 어떤 경우에 유용합니까?
Jesse Jashinsky

@Jesse : 컴파일러가 잘못된 경우 (예 : " 'Stupid Flanders'warning"). 컴파일을 시도하십시오 : void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }. 일부 환경 (예 : NetBeans 7.3 w / Java 6 JDK [1.6.0_41])은 해당 시점에서 널이 될 수 없더라도 호출 "o possibly null"에서 생성 됩니다. o.toString()o

2
@cletus : 이클립스에 경고 유형을 추가 할 수 있습니까? 문제는 우리 팀 멤버 중 한 명이 IntelliJ를 사용하고 IDE에는 Eclipse에서 경고를주는 다른 억제 경고 유형이 있다는 것입니다. ...
KC

semicolon루나에서 작동하지 않는 것 같습니까? :( semicolon실제로 누군가 유효한지 확인할 수 있습니까 ?
Kissaki

"최종 필드에서 동기화"경고를 억제하는 값은 무엇입니까?
matteo

48

모든 값이 허용됩니다 (인식되지 않은 값은 무시 됨). 인식되는 목록은 컴파일러마다 다릅니다.

에서 자바 튜토리얼 uncheckeddeprecationJava 언어 사양에서 요구하는 두 개의 경고로 표시됩니다, 따라서 그들은 모두 컴파일러로 유효해야합니다 :

모든 컴파일러 경고는 범주에 속합니다. Java 언어 사양에는 더 이상 사용되지 않는 항목과 선택되지 않은 항목의 두 가지 범주가 있습니다.

Java 언어 사양 에서 정의 된 특정 섹션 은 버전간에 일관성이 없습니다. 자바 SE 8 사양에서 uncheckeddeprecation섹션의 컴파일러 경고로 나열됩니다 9.6.4.5. @SuppressWarnings9.6.4.6 @Deprecated .

Sun 컴파일러의 경우 running javac -X은 해당 버전에서 인식되는 모든 값 목록을 제공합니다. 1.5.0_17의 경우 목록은 다음과 같습니다.

  • 모두
  • 천칭
  • 확인되지 않은
  • 실패로 끝나다
  • 통로
  • 연속물
  • 드디어

43

목록은 컴파일러마다 다릅니다. 그러나 Eclipse 에서 지원되는 값은 다음과 같습니다.

  • 더 이상 사용되지 않는 코드 내에서도 더 이상 사용되지 않습니다.
  • allJavadoc이 유효하지 않거나 누락 된 javadoc
  • assertIdentifier 식별자로 사용 된 assert 발생
  • 권투 오토 박싱 변환
  • charConcat 문자 배열을 문자열로 변환되지 않고 명시 적 문자열 연결에 사용될 때
  • 조건 우연한 부울 할당 가능
  • 생성자 이름이있는 constructorName 메소드
  • dep-ann에 @Deprecated 주석이 없습니다.
  • 더 이상 사용되지 않는 유형 또는 더 이상 사용되지 않는 코드 외부의 멤버 사용 중단
  • 권장되지 않은 액세스 규칙과 일치하는 유형의 사용을 권장하지 않습니다
  • emptyBlock 문서화되지 않은 빈 블록
  • enumSwitch , 불완전한 스위치 불완전한 열거 형 스위치
  • 위해 fallthrough 가능한 경우 위해 fallthrough
  • fieldHiding 다른 변수를 숨기는 필드
  • final 바운드가있는 finalBound 유형 매개 변수
  • 마지막 으로 정상적으로 완료되지 않는 블록
  • 금지 된 액세스 규칙과 일치하는 유형의 금지 된 사용
  • fieldHiding, localHiding, typeHiding 및 maskedCatchBlock에 대한 매크로 숨기기
  • 정적 멤버에 대한 indirectStatic 간접 참조
  • 수퍼 인터페이스로 사용되는 intfAnnotation 주석 타입
  • intfNonInherited 인터페이스 상속되지 않은 메소드 호환성
  • javadoc 유효하지 않은 javadoc
  • localHiding 다른 변수를 숨기는 지역 변수
  • maskedCatchBlocks 숨겨진 캐치 블록
  • nls 비 nls 문자열 리터럴 (태그 없음 // $ NON-NLS-)
  • noEffect 효과가없는 할당 할당
  • 가능성 누락 또는 중복 널 점검
  • nullDereference 누락 null 검사
  • 초과 무효 누락 @ 재정의 주석
  • 매개 변수에 대한 paramAssign 할당
  • pkgDefaultMethod가 패키지 기본 메소드를 대체하려고 시도 함
  • 원시 사용법 a (매개 변수화 된 유형 대신) 원시 유형
  • 세미콜론 불필요한 세미콜론 또는 빈 명령문
  • 시리얼 누락 serialVersionUID
  • specialParamHiding 생성자 또는 다른 필드를 숨기는 setter 매개 변수
  • indirectStatic 및 staticReceiver 용 정적 액세스 매크로
  • 정적 필드를 가져 오거나 정적 메소드를 호출하는 데 비 정적 수신자가 사용되는 경우 staticReceiver
  • 수퍼 호출없이 메소드를 오버라이드
  • 억제 @SuppressWarnings 가능
  • 내부 클래스에 대한 합성 액세스를 수행 syntheticAccess, 합성 액세스
  • tasks 는 소스 코드에서 tasks 태그를 지원합니다
  • 다른 유형을 숨기는 typeHiding 유형 매개 변수
  • 확인 되지 않은 확인 되지 않은 유형 작업
  • 불필요한 else else 절
  • 규정되지 않은 필드 액세스, 규정 되지 않은 필드 규정 되지 않은 필드 참조
  • 미사용 인수에 대한 미사용 매크로
  • unusedArgument 하지 않는 방법 인수
  • unusedImport 되지 않는 수입 참조
  • unusedLabel 하지 않는 라벨
  • unusedLocal 않는 로컬 변수
  • 비공개 미사용 개인 멤버 선언
  • unusedThrown 되지 않는 선언 발생한 예외
  • uselessTypeCheck 불필요한 캐스트 / instanceof를 작동
  • varargsCast varargs 인수에는 명시 적 캐스트가 필요합니다
  • @SuppressWarnings의 warningToken 처리되지 않은 경고 토큰

Sun JDK (1.6)에는 지원되는 경고 목록 이 더 짧습니다 .

  • 사용 중단 감가 상각 항목의 사용을 확인합니다.
  • unchecked Java 언어 사양에서 요구하는 확인되지 않은 변환 경고에 대한 자세한 정보를 제공하십시오.
  • serial serializable 클래스에서 serialVersionUID 정의가 누락되었음을 경고합니다.
  • finally 정상적으로 완료 할 수없는 finally 절에 대해 경고합니다.
  • 폴 스루 폴 스루 사례에 대한 스위치 블록을 확인하고 발견 된 경우 경고 메시지를 제공합니다.
  • path 환경 경로에 존재하지 않는 경로 (예 : classpath)를 확인하십시오.

Mac 용으로 사용 가능한 최신 javac (1.6.0_13)에는 다음과 같은 지원되는 경고가 있습니다.

  • 모두
  • 캐스트
  • 천칭
  • divzero
  • 확인되지 않은
  • 실패로 끝나다
  • 통로
  • 연속물
  • 드디어
  • 재정의

이클립스 목록은 SuppressWarning 주석이 아닌 컴파일러 플래그를 찾습니다 (연결 한 문서의 마지막 부분을 확인하십시오).
Ron Tuffin

3
그들은 둘 다. 컴파일러 플래그를 설정하면 원하는 경고 종류를 컴파일러에 알립니다. 주석을 사용하면 코드의 특정 위치에서 이러한 경고를 억제 할 수 있습니다.
D. Wroblewski

이 목록은 Eclipse보다 짧다고 생각합니다. 최신 갈릴레오 문서, SupressWarnings에 해당하는 토큰의 목록을 참조가 명시 적입니다 : help.eclipse.org/galileo/index.jsp?topic=/...는
피터 Štibraný

2
Eclipse 3.5에서 @SuppressWarnings ( "raw")를 시도했지만 작동하지 않습니다. "raw"가이 주석에 유효한 값이 아니라는 경고가 표시됩니다.
Jesper

나도. 불행히도 jsp 지원은 Java 지원만큼 플러시되지 않습니다.
stu dec

9

나에게 가장 좋아하는 것은 @SuppressWarnings("WeakerAccess")IntelliJ에 있으며, 사용하는 것보다 액세스 수정자가 약해야한다고 생각할 때 불평하지 않습니다. 테스트를 지원하기 위해 일부 메소드에 대한 공개 액세스 권한이 있어야하며 @VisibleForTesting주석이 경고를 막지 않습니다.

ETA : "익명"은 @MattCampbell 링크 된 페이지에서 다음과 같은 매우 유용한 참고 사항을 언급했습니다.

설명하려는 목적으로이 목록을 사용할 필요는 없습니다. 요청하면 IntelliJ가 SuppressWarnings를 자동으로 추가합니다. 내가 기억하는 것처럼 많은 릴리스 에서이 작업을 수행 할 수있었습니다.

경고가있는 위치로 이동하여 Alt-Enter를 입력하십시오 (또는 검사 목록에서 경고를 선택하십시오). 메뉴가 나타나면 경고를 표시하고 수정을 제공하는 오퍼링이 표시됩니다 (예 : 경고가 "메소드가 정적 일 수 있습니다"인 경우 "정적"은 IntellJ가이를 대신하여 제공합니다). 오른쪽 화살표 버튼을 사용하여 "검사 프로필 설정 편집"등과 같은 옵션이있는 하위 메뉴에 액세스하십시오. 이 목록의 맨 아래에는 "클래스에 대한 모든 검사 억제", "클래스에 대한 억제", "방법에 대한 억제"및 때때로 "구문에 대한 억제"와 같은 옵션이 있습니다. 당신은 아마 이들 중 하나가 목록의 마지막에 나타날 것을 원할 것입니다. 이 중 하나를 선택하면 해당 경고를 억제하는 @SuppressWarnings 주석 (또는 경우에 따라 주석)이 코드에 추가됩니다. IntelliJ가 선택한 경고를 기반으로 선택하므로 추가 할 주석을 추측 할 필요가 없습니다.


2

IntelliJ//noinspection 에서 자동 생성 될 수 있음을 알았습니다.

  • @SuppressWarninigs진술 전에 계획이 없는지 확인하십시오
  • 이제 경고를 선택한 경우 Alt + Enter를 눌러 특정 항목 //noinspection을 자동 생성 한 다음 오른쪽 화살표 키 를 사용 하여 Suppress for ... 옵션 을 볼 수 있습니다.

IntelliJ의 "스위치에 케이스 레이블이 너무 적습니다"경고를 표시하지 않으려 고 여기에서 종료되었습니다. IntelliJ의 @SuppressWarning지원에 대한 완전한 목록을 //noinspection찾지 못했지만 나를 위해 속임수를 사용했습니다.


@SuppressWarnings ( "SwitchStatementWithTooFewBranches")도 추가 할 수 있습니다.
JPM

불행히도 ALT + ENTER를 클릭 할 때
Supress

//noinspection SwitchStatementWithTooFewBranches전과 switch아니라 나를 위해 작동합니다.
Oliver Hausler

1

그리고 이것은 훨씬 더 완전한 목록 인 것 같습니다. 여기서 다른 곳에서는 찾을 수없는 Android-Studio 관련 경고를 발견했습니다 (예 : SynchronizeOnNonFinalField)

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

아, 이제 SO의 가이드 라인은 SO의 제한을 준수합니다. 한편으로는 링크 만 제공하는 대신 목록을 복사해야합니다. 그러나 다른 한편으로는 최대 허용 문자 수를 초과합니다. 링크가 끊어지지 않기를 바랍니다.


1

JSL 1.7

오라클 설명서 에는 다음이 언급되어 있습니다.

  • unchecked: 확인되지 않은 경고는 "확인되지 않은"문자열로 식별됩니다.
  • deprecation: Java Deprecated 주석으로 주석이 지정된 유형, 메소드, 필드 또는 생성자를 사용할 때 (예 : 대체, 호출 또는 이름으로 참조) Java 컴파일러는 다음과 같은 경우를 제외하고 사용 중단 경고를 생성해야합니다. [...] @SuppressWarnings ( "deprecation") 주석으로 경고를 억제하기 위해 주석이 달린 엔티티 내에 사용됩니다. 또는

그런 다음 구현이 자체적으로 추가하고 문서화 할 수 있다고 설명합니다.

컴파일러 공급 업체는이 주석 유형과 함께 지원하는 경고 이름을 문서화해야합니다. 공급 업체는 동일한 이름이 여러 컴파일러에서 작동하도록 협력하는 것이 좋습니다.


1
unchecked표준에 의해 승인 된 유일한 것은 사실이 아닙니다 . 당신이 인용 한에서 바로 다음 섹션에서는 사용 중단 경고가 "사용은 주석으로 경고를 억제하는 주석이 기업 내에있을 때 발생하지 않음 말한다 @SuppressWarnings("deprecation")"
kbolino

1

https://gist.github.com/vegaasen/157fbc6dce8545b7f12c 에 IntelliJ 억제 매개 변수의 마스터 목록이 있음을 추가하고 싶습니다.

상당히 포괄적으로 보입니다. 부분 :

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

SonarLint를 사용하는 경우 메소드 위 또는 전체 오징어 문자열을 분류하십시오 : @SuppressWarnings ( "squid : S1172")

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.