My favorite features in Java 7

So far following are my favorite new features in Java 7, I wonder why these were not added in earlier version.

1. The try-with-resources Statement

Any object that implements java.lang.AutoCloseable, which includes all objects which implement, can be used as a resource.

static String readFirstLineFromFile(String path) throws IOException {
          try (BufferedReader br = new BufferedReader(new FileReader(path))) {
                     return br.readLine();

In this example, the resource declared in the try-with-resources statement is a BufferedReader. The declaration statement appears within parentheses immediately after the try keyword. The class BufferedReader, in Java SE 7 and later, implements the interface java.lang.AutoCloseable. Because the BufferedReader instance is declared in a try-with-resource statement, it will be closed regardless of whether the try statement completes normally or abruptly (as a result of the method BufferedReader.readLine throwing an IOException).

Prior to Java SE 7, you can use a finally block to ensure that a resource is closed regardless of whether the try statement completes normally or abruptly. The following example uses a finally block instead of a try-with-resources statement:

static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
       BufferedReader br = new BufferedReader(new FileReader(path));
       try {
           return br.readLine();
       } finally { // no need of closing in finally clause in Java 7
          if (br != null) br.close();

And you can declare more than one resource to close:

try (
 InputStream in = new FileInputStream(src);
 OutputStream out = new FileOutputStream(dest))
 // code

2.Catching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking

In Java SE 7 and later, a single catch block can handle more than one type of exception. This feature can reduce code duplication and lessen the temptation to catch an overly broad exception.

Consider the following example, which contains duplicate code in each of the catch blocks:

   catch (IOException ex) {    
       throw ex; }
   catch (SQLException ex) { 
       throw ex; 

In releases prior to Java SE 7, it is difficult to create a common method to eliminate the duplicated code because the variable ex has different types.
The following example, which is valid in Java SE 7 and later, eliminates the duplicated code:

  catch (IOException|SQLException ex) {
    throw ex;

The catch clause specifies the types of exceptions that the block can handle, and each exception type is separated with a vertical bar (|).

Note: If a catch block handles more than one exception type, then the catch parameter is implicitly final. In this example, the catch parameter ex is final and therefore you cannot assign any values to it within the catch block.

Bytecode generated by compiling a catch block that handles multiple exception types will be smaller (and thus superior) than compiling many catch blocks that handle only one exception type each. A catch block that handles multiple exception types creates no duplication in the bytecode generated by the compiler; the bytecode has no replication of exception handlers.

3.Type Inference for Generic Instance Creation

You can replace the type arguments required to invoke the constructor of a generic class with an empty set of type parameters () as long as the compiler can infer the type arguments from the context. This pair of angle brackets is informally called the diamond.

For example, consider the following variable declaration:

    Map<String, List> myMap = new HashMap<String, List>();

In Java SE 7, you can substitute the parameterized type of the constructor with an empty set of type parameters ():


JPS – Java Process Status tool

You are running your java program and wondering what all process are running in JVM. Ever wondered how to see java process ?
Use JPS for viewing Java Virtual Machine Status

The jps tool lists the instrumented HotSpot Java Virtual Machines (JVMs) on the target system. The tool is limited to reporting information on JVMs for which it has the access permissions.

If jps is run without specifying a hostid, it will look for instrumented JVMs on the local host. If started with a hostid, it will look for JVMs on the indicated host, using the specified protocol and port. A jstatd process is assumed to be running on the target host.

The jps command will report the local VM identifier, or lvmid, for each instrumented JVM found on the target system. The lvmid is typically, but not necessarily, the operating system’s process identifier for the JVM process. With no options, jps will list each Java application’slvmid followed by the short form of the application’s class name or jar file name. The short form of the class name or JAR file name omits the class’s package information or the JAR files path information.

The jps command uses the java launcher to find the class name and arguments passed to themain method. If the target JVM is started with a custom launcher, the class name (or JAR file name) and the arguments to the main method will not be available. In this case, the jpscommand will output the string Unknown for the class name or JAR file name and for the arguments to the main method.

The list of JVMs produced by the jps command may be limited by the permissions granted to the principal running the command. The command will only list the JVMs for which the principle has access rights as determined by operating system specific access control mechanisms.


The jps command supports a number of options that modify the output of the command. These options are subject to change or removal in the future.

Suppress the output of the class name, JAR file name, and arguments passed to the mainmethod, producing only a list of local VM identifiers.
Output the arguments passed to the main method. The output may be null for embedded JVMs.
Output the full package name for the application’s main class or the full path name to the application’s JAR file.
Output the arguments passed to the JVM.
Output the arguments passed to the JVM through the flags file (the .hotspotrc file or the file specified by the -XX:Flags=filename> argument).
Pass option to the java launcher called by javac. For example, -J-Xms48m sets the startup memory to 48 megabytes. It is a common convention for -J to pass options to the underlying VM executing applications written in Java.

Java Clone method

To clone something is to make a duplicate of it.The clone() method in Java makes an exact duplicate of an object .

Why would someone need cloneing ?
Java’s method calling semantics are call-by-refrence , which allows the called method to modify the state of an object that is passed into it . Cloning the input object before calling the method would pass a copy of the object keeping orignal safe.

Cloneing is not enabled by default in classes that you write.Clone method is a protected method , which means that your code cannot simply call it .Only the class defining can clone it’s objects.

Foo f = new Foo();
Foo f2 = new f.clone();

If you try clone() without any special prepration as in code written above you will encouter errors.

How to clone?
You must do two things to make your class cloneable:

  • Override Object’s Clone method
  • Implement the empty Cloneable interface

Example :

public class FooClone impements Cloneable{

public FooObject clone() throws CloneNotSupportedException

( return super.clone();


// more code

How to use Java member accessibility modifiers

Java member accessibility modifiers in Java

In Java by using accessibility modifiers a class can control what information is accessible to other classes.
Accessibility of members can be one of the following.

  • public
  • protected
  • default(also known as package accessibility)
  • private

public Members

Public access is the least restrictive of all access modifiers .A public member is accessible everywhere , both in its class’s package and in other packages where it’s class is visible .This is true for both instances and static members.

protected Members

Protected members are accessible in the package containing class and by all subclasses of this class in any package where this class is visible . {it is less restrictive than the defaultaccessibility}

Default Accessibility Members

When no access modifier is specified for a member it is only accessible by another class in the package where it’s class is defined .Even if its class is visible in another package the member is not accessible there .

private Members

private is most restrictive of all the access modifiers .Private members are not accessible from any other class .This also applies to subclasses , whether they are in the same package or not.

It is a good design strategy to make all members variables private and provide public access methods for them.