try-catch-finally
在jdk1.7之前进行使用,操作比较繁琐,由于涉及关闭资源也会有异常,所以在finally里面也需要进行try-catch的操作,这样就会使得代码会很多,不是很方便。看如下代码:
@Test
public void testServer(){
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
ServerSocket ss = new ServerSocket(8889);
socket = ss.accept();
is = socket.getInputStream();
baos = new ByteArrayOutputStream();
byte[] bytes = new byte[10];
int len;
while ((len = is.read(bytes)) != -1){
baos.write(bytes,0,len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(baos != null){
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
就像这个接受数据的代码,finally里面的代码就占了一大半了,看起来就会显得很冗余,所以我们需要减少这样的代码,可以用try-with-resource
try-with-resource
在jdk1.7之后我们就可以使用try-with-resource的语法,进行资源的关闭了,不需要我们去手动关闭资源了,减少了很多代码。如下代码
@Test
public void testServer2() {
try (ServerSocket ss = new ServerSocket(8889);
Socket socket = ss.accept();
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream())
{
byte[] bytes = new byte[10];
int len;
while ((len = is.read(bytes)) != -1) {
baos.write(bytes, 0, len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
可以看到,这样的代码就比较简洁了,这是把需要关闭的资源放到圆括号里面,这样系统就会自动帮我们关闭资源了,就不需要我们手动去关闭资源了。