Java7 新特性(根据学习进度持续更新)

1、改进了switch分支语句,允许switch语句中的控制表达式为java.lang.String类型。

String s = "test";  

switch (s) { 
    case "test" : 
     System.out.println("test"); 
    case "test1" : 
     System.out.println("test1"); 
     break ; 
    default : 
     System.out.println("break"); 
     break ; 
}

2、数值中使用下画线分隔:

int a = 0B1000_0000_0000_0000_0000_0000_0000_0011;

  

3、新添了一个Objects具类,它提供了一些方法来操作对象,这些工具方法大多是“空指针”安全的。比如,你不能明确地判断一个引用变量是否为null,如果贸然地调用改变量的toString()方法,则可能发生NullPointerException异常;如果使用Objects类提供的toString(Object o)方法,就不会引发空指针异常,当o为null 时,程序将返回一个“null”字符串。

import java.util.Objects;

public class ObjectsTest {
	
	//定义一个obj变量,默认为null
	static ObjectsTest obj;
	
	public static void main(String[] args) {
		
		//输出一个null对象的hashCode值,输出0
		System.out.println(Objects.hashCode(obj));
		
		//输出一个null对象的toString,输出null
		System.out.println(Objects.toString(obj));
		
		//要求obj不能为null,如果为null则引发异常
		System.out.println(Objects.requireNonNull(obj));

	}

}

  

4、java7新增了一个类ThreadLocalRandom,它是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程竞争,最终保证系统具有更好的线程安全。

  ThreadLocalRandom类的用法与Random用法基本类似,它提供一个静态的current()方法来获取ThreadLocalRandom对象,获取对象之后即可调用各种nextXXX()方法来获取伪随机数了。

  ThreadLocalRandom与Random都比Math的random()方法提供更多的方式来生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围。

 

5、Java7泛型的“菱形”语法:

java7允许在构造器后不跟完整的泛型信息,只需要给出一对尖括号(<>)即可。

List<String> strList = new ArrayList<> ();

  

6、java7提供多异常捕捉

在java7以前,每个catch只能捕获一种类型的异常,但从java7开始,一个catch块可以捕获多种类型的异常。

使用一个catch捕获多种类型的异常的时候需要注意如下两个地方:

  捕获多种异常的时候,多种异常类型之间用竖线(|)隔开;

  捕获多种类型的异常的时候,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。

public class MultiExceptionTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try{
            int a = Integer.parseInt(args[0]);
            int b = Integer.parseInt(args[1]);
            int c = a / b;
            System.out.println("您输入的两个数相除的结果是:" + c );
        }
        catch(IndexOutOfBoundsException|NumberFormatException|ArithmeticException ie){
            System.out.println("程序发生了数组越界、数字格式异常、算术异常之一");
            //此处的 ie 默认有final修饰,所以不能改变,不能重新赋值。所以下面一行代码是错误的
            //ie = new ArithmeticException("test");
        }
        catch (Exception e){
            System.out.println("未知异常。");
            //捕获一种异常的时候,异常类型没有final修饰,所以下面的代码是合法的。
            e = new RuntimeException("test");
        }

    }

}

 

  

7、java7中的try语句可以自动关闭资源

  java7增强了try语句的功能,它允许在try关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源(此处的资源是指那些必须在学程序结束时显式关闭的资源,比如数据库连接,网络连接等),try语句在该语句结束时自动关闭这些资源。

  这些资源必须实现AutoCloseable或者Closeable接口,实现这两个接口就必须实现close() 方法。

Ps. java7几乎把所有的“资源类”(包括文件IO的各种类,JDBC编程的Connection、Statement等接口……)进行了改写,改写后的资源类都实现了AutoCloseable或Closeable接口。

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;

public class AutoCloseTest {

    /**
     * @param args
     */
    public static void main(String[] args) throws IOException{
        try(
                //声明、初始化两个可关闭的资源
                //try语句会自动关闭这两个资源
                BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java"));
                PrintStream ps = new PrintStream(new FileOutputStream("a.txt"))
                )
                {
            //使用两个资源
            System.out.println(br.readLine());
            ps.println("庄生晓梦迷蝴蝶");
                }
        //自动关闭资源的try语句相当于包含了隐式的finally块,用于关闭资源,所以这个try语句可以既没有catch块,也没有finally块。

    }

}

 8、java7增强的throw语句

  对于如下代码:

try{
    new FileOutputStream("a.txt");
    }
catch(Exception ex){
    ex.printStackTrace();
    throw ex;
    }

  上面代码片段中“throw ex”再次抛出了捕获到的异常,但这个ex 对象的情况比较特殊:程序捕获该异常时,声明该异常的类型为Exception,但实际上try块中可能只调用了FileOutputStream 构造器,这个构造器声明只是抛出了FileNotFoundException异常。

  在java7以前,java编译器的处理“简单而粗暴“——由于在捕获该异常的时候声明ex的类型是Exception,因此java编译器认为这段代码可能抛出Exception异常,所以包含这段代码的方法通常要声明抛出Exception异常,例如以下方法:

import java.io.FileOutputStream;

public class ThrowTest2 {

    public static void main(String[] args) 
    //java6认为 “throw ex”代码可能抛出Exception异常。所以此处声明抛出Exception异常
    throws Exception
    {
        try
        {
            new FileOutputStream("a.txt");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            throw ex;
        }

        
    }

}

从java7开始,java编译器会进行更细致的检查,java编译器会检查throw语句抛出异常的实际类型,这样编译器就可以知道”throw ex“语句实际上只可能抛出FileNotFoundException异常,因此在方法签名中只要声明抛出该异常即可。既可以将代码改成如下形式:

public class ThrowTest2 {

    public static void main(String[] args) 
    
    throws FileNotFoundException
    {
        try
        {
            new FileOutputStream("a.txt");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            throw ex;
        }

        
    }

}

 9、java7为JColorChooser增加了一个HSV标签页,允许用户通过HSV模式来选择颜色。

 

10、java7 为Statement新增了closeOnCompletion()方法,如果Statement执行了该方法,则当所有依赖于该Statement的ResultSet关闭时,该Statement会自动关闭。java7还为Statement提供了一个isCloseOnCompletion()方法,该方法用于判断该Statement是否打开了"closeOnCompletion".

 

11、java7为Connection新增了setSchema(String schema)、getSchema()两个方法,这两个方法用于控制该Connection访问的数据库Schema。java7还为Connection新增了setNetWorkTimeout(Executor executor , int milliseconds)、getNetWorkTimeout() 两个方法来控制数据库连接的超时行为。

 

12、 在Java 6.0 时代,RowSet并未得到广泛应用。Java 7 新增了RowSetProvider 类和RowSetFactory 接口。其中RowSetProvider 负责创建RowSetFactory ,而RowSetFactory 则提供了一些方法来创建RowSet实例。具体见api文档。

posted on 2013-02-25 15:01  JLeight  阅读(550)  评论(0编辑  收藏  举报

导航