Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Java's file-manipulation methods often indicate failure with a return value instead of throwing an exception. The Java Tutorials for Java 7 note:

Prior to the Java SE 7 release, the java.io.File class was the mechanism used for file I/O, but it had several drawbacks.

One of these drawbacks is that:

Many methods didn't throw exceptions when they failed, so it was impossible to obtain a useful error message. For example, if a file deletion failed, the program would receive a "delete fail" but wouldn't know if it was because the file didn't exist, the user didn't have permissions, or there was some other problem.

Consequently, programs that ignore the return values from file operations often fail to detect that those operations have failed. Java programs must check the return values of methods that perform file I/O (this . This is a specific instance of rule EXP00-J. Do not ignore values returned by methods).

Noncompliant Code Example (delete())

This noncompliant code example attempts to delete a specified file but gives no indication of its success. The Java Platform, Standard Edition 6 API Specification [API 2006] platform requires File.delete() to throw a SecurityException only when the program lacks authorization to delete the file [API 2014]. No other exceptions are thrown, so the deletion can silently fail.

Code Block
bgColor#FFCCCC

File file = new File(args[0]);
file.delete();

...

This compliant solution checks the return value of delete().:

Code Block
bgColor#ccccFF

File file = new File("file");
if (!file.delete()) {
  System.out.println("// Deletion failed");, handle error
}

Compliant Solution

...

This compliant solution uses the java.nio.file.Files.delete() method from Java SE 7 to delete the file.:

Code Block
bgColor#ccccFF

Path file = new File(args[0]).toPath();
try {
  Files.delete(file);
} catch (IOException x) {
   System.out.println("// Deletion failed");
  // , handle error
}

The Java SE 7 Documentation [J2SE 2011] defines Files.delete() to throw the following exceptions:

Exception

Reason

NoSuchFileException

File does not exist

DirectoryNotEmptyException

File is a directory and could not otherwise be deleted because the directory is not empty

IOException

An I/O error occurs

SecurityException

In the case of the default provider and a security manager is installed, the SecurityManager.checkDelete(String) method is invoked to check delete access to the file

Since Because SecurityException is a runtime exception, it need not be declared. And Because NoSuchFileException and DirectoryNotExmptyException both inherit from IOException, they will be caught by the compliant solution's catch clause.

...

Failure to check the return values of methods that perform file I/O can result in unexpected behavior.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

FIO02-J

medium

probable

high

P4

L3

Related Guidelines

Medium

Probable

Medium

P8

L2

Automated Detection

ToolVersionChecker

Description

CodeSonar
Include Page
CodeSonar_V
CodeSonar_V

JAVA.FUNCS.IRV

Ignored Return Value (Java)

SonarQube
Include Page
SonarQube_V
SonarQube_V
S899


Related Guidelines

Bibliography

[API

2006

2014]

File.delete()

[J2SE 2011]

Files.delete()

[Seacord

2005

2013]

Chapter

7

8, "File I/O"


...

Image Removed      12. Input Output (FIO)      Image Added Image Added