Skip to main content
GitHub

MET02-J. Do not use deprecated or obsolete classes or methods

Never use deprecated fields, methods, or classes in new code. Java provides an @deprecated annotation to indicate the deprecation of specific fields, methods, and classes. For example, many methods of java.util.Date , such as Date.getYear() , have been explicitly deprecated. THI05-J. Do not use Thread.stop() to terminate threads describes issues that can result from using the deprecated Thread.stop() method.

The Java SE documentation provides a list of deprecated APIs for each version of the language:

Programmers should use the list of deprecated functions specific to the language version they are using, although it may also be possible to avoid the use of APIs that are deprecated in later versions as well if suitable alternatives are available.

Obsolete fields, methods, and classes should not be used. Java lacks any annotation that indicates obsolescence; nevertheless, several classes and methods are documented as obsolete. For instance, the java.util.Dictionary<K,V> class is marked as obsolete; new code should use java.util.Map<K,V> instead [ API 2014 ].

Obsolete Methods and Classes

The methods and classes listed in the following table must not be used:

Class or MethodReplacementRule
java.lang.Character.isJavaLetter()java.lang.Character.isJavaIdentifierStart()
java.lang.Character.isJavaLetterOrDigit()java.lang.Character.isJavaIdentifierPart()
java.lang.Character.isSpace()java.lang.Character.isWhitespace()
java.lang.Class.newInstance()java.lang.reflect.Constructor.newInstance()ERR06-J. Do not throw undeclared checked exceptions
java.util.Date (many methods)java.util.Calendar
java.util.Dictionary<K,V>java.util.Map<K,V>
java.util.Properties.save()java.util.Properties.store()
java.lang.Thread.run()java.lang.Thread.start()THI00-J. Do not invoke Thread.run()
java.lang.Thread.stop()java.lang.Thread.interrupt()THI05-J. Do not use Thread.stop() to terminate threads
java.lang.ThreadGroup (many methods)java.util.concurrent.ExecutorTHI01-J. Do not invoke ThreadGroup methods
java.util.Datejava.time (since Java 8)

The Java Virtual Machine Profiler Interface (JVMPI) and JVM Debug Interface (JVMDI) are also deprecated and have been replaced by the JVM Tool Interface (JVMTI) (see ENV05-J. Do not deploy an application that can be remotely monitored for more information).

Risk Assessment

Using deprecated or obsolete classes or methods in program code can lead to erroneous behavior.

RuleSeverityLikelihoodDetectableRepairablePriorityLevel
MET02-JLowUnlikelyYesNoP2L3

Automated Detection

Detecting uses of deprecated methods is straightforward. Obsolete methods have no automatic means of detection.

ToolVersionCheckerDescription
Parasoft Jtest
2026.1
CERT.MET02.DPRAPI
CERT.MET02.THRD
Do not use deprecated APIs
Avoid calling unsafe deprecated methods of 'Thread' and 'Runtime'
Security Reviewer - Static Reviewer
6.02
DEPRECATED_1Full Implementation
SonarQube
9.9
S1874"@Deprecated" code should not be used
ISO/IEC TR 24772:2010Deprecated Language Features [MEM]
MITRE CWECWE-589 , Call to Non-ubiquitous API

Android Implementation Details

The Android SDK has deprecated and obsolete APIs. Also, there may exist incompatible APIs depending on the SDK version. Consequently, it is recommended that developers refer to the "Android API Differences Report" and consider replacing deprecated APIs.

Bibliography

[ API 2014 ]Deprecated API Interface Map&lt;K,V&gt;
[ SDN 2008 ]Bug database, Bug ID 4264153