`
FlyingFairy
  • 浏览: 11947 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java通信中遇到finally关键字

阅读更多

最近在学习简单的socket通信开发,在查找一些网上资料的时候,看到了之前在了解异常机制时没太注意的东西就是 finally关键字。

代码如下,中间部分省略

 

DataInputStream dis = null;
DataOutputStream dos = null;
try {
	cServerSocket = new ServerSocket(PORT);
	while (true) {
		System.out.println("正在等待客户连接...");
		cSocket = cServerSocket.accept();
		dis = new DataInputStream(cSocket.getInputStream());
		dos = new DataOutputStream(cSocket.getOutputStream());
		String clientStr = dis.readUTF();
		dos.writeUTF("已收到信息:" + clientStr);
		/**省略部分代码,,**/
		System.out.println("---------------------------------");
	}
} catch (IOException e) {
	e.printStackTrace();
} finally {
	try {
		if (dis != null) {	
		dis.close();
		}
		if (dos != null) {
			dos.close();
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

 如果不使用finally关键字的时候,必须编写如何关闭流对象,且需要使close()方法在不论异常与否时都会执行,这就可以使用finally关键字了。

finally 块确保 close 方法总被执行,而不管 try 块内是否发出异常。因此,可以确保在退出该方法之前总会调用 close 方法。这样就可以确信close()方法已经执行并且没有泄漏资源。在此方法中不需要再有一个 catch 块。

finally 块必须与 try 或 try/catch 块配合使用。此外,不可能退出 try 块而不执行其 finally 块。如果 finally 块存在,则它总会执行。

/***********听说我是分割线***********/

以上是我对finally关键字在我的代码中的运用的了解,然而更进一步了解时。

发现一个使用finally关键字的问题,就是只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行。如果是在 try 语句块之前返回(return)或者抛出异常,所以 try 对应的 finally 语句块没有执行。

例如:

 

package Test;

public class Test {
	public static void main(String[] args) {
		System.out.println("return value of test(): " + test());
	}

	public static int test() {
		int i = 1;
		System.out.println("the previous statement of try block");
		i = i / 0;

		try {
			System.out.println("try block");
			return i;
		}catch(Exception e){
			e.printStackTrace();
			return 0;
		}
		finally {
			System.out.println("finally block");
		}
	}
}

 这个道理好像是显而易见的,已经毕竟代码还没有执行到 try语句就已经出现异常时而停止执行了,即不会继续执行下面的代码。如果在try之前就return了一个值,效果也是一样的。

 

然而,,,,在我继续了解时发现,如果一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。。。

综上来看,如果try语句被正常的执行了,即被执行了且不会中断执行,这时finally语句一定会被执行。。。

 

然而发现 如果真的要深究finally块的执行顺序,还需要直接去了解Java语言规范更好,,先就到这,我还是去写安卓通信去了。。。

 

 

1
2
分享到:
评论
1 楼 DavyJones2010 2015-08-11  
在Java 7之后可以用try-with-resources语法来关闭资源.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
try (Socket socket = serverSocket.accept();
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());) {
// do some stuffs here
} catch (IOException e) {
e.printStackTrace();
}

相关推荐

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...

    JAVA面试题最全集

    50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52.一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握...

    JAVA基础课程讲义

    JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...

    Java 基础核心总结 +经典算法大全.rar

    与 Exception 有关的 Java 关键字 throws 和 throw try 、finally 、catch 什么是 Error 内部类 创建内部类集合 Iterable 接口顶层接口 ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 ...

    java后端面试题-一些Java后端开发面试题的链接,希望对您有所帮助

    请解释Java中的异常处理机制,包括try-catch-finally和throw关键字的使用。 请解释Java中的集合框架,包括List, Set, Map等接口及其常用实现类。 请解释Java中的泛型,以及它在编译时和运行时的作用。 请解释Java中...

    java 面试题 总结

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...

    疯狂JAVA讲义

    3.2.3 Java关键字 47 3.3 数据类型分类 48 3.4 基本数据类型 48 3.4.1 整型 49 3.4.2 字符型 49 3.4.3 浮点型 51 3.4.4 布尔型 52 3.5 基本类型的类型转换 53 3.5.1 自动类型转换 53 3.5.2 强制类型转化 54...

    java面试宝典

    75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private ...

    整理后java开发全套达内学习笔记(含练习)

    final (关键字) finally (关键字) fragments 段落; 代码块 ['frægmәnt] FrameWork [java] 结构,框架 ['freimwә:k] Generic [java] 泛型 [dʒi'nerik] goto (保留字) 跳转 heap n.堆 [hi:p] implements ...

    超级有影响力霸气的Java面试题大全文档

     异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获...

    java经典面试2010集锦100题(不看你后悔)

    下面关键字中,如果同时出现时,必须放在第一位的是:(选择1项) A) interface B) package C) import D) class 题目19:d 下面关于接口的描述错误的是:(选择1项) A) 定义接口的关键字为interface,接口中可以...

    超爽的自学课件(java)

    这一章将解释try、catch、throw、throws以及finally等关键字在Java中的工作原理。并讲述什么时候应当“掷”出违例,以及在捕获到违例后该采取什么操作。此外,大家还会学习Java的一些标准违例,如何构建自己的违例,...

    java自学之道

    3.1 Socket通信的一般结构 3.2 TCP Socket编程 3.2.1 Socket类 3.2.2 ServerSocket类 3.3 UDP Socket编程 八、Java概念疑难解答 第2章 Java经典练习题 2.1 斐波那契数列 2.2 判断素数 2.3 水仙花数 2.4 分解质因数 ...

    Java开发技术大全 电子版

    第4篇Java中的高级技术 第8章Java的多线程机制266 8.1线程的概念266 8.1.1多线程的特点266 8.1.2线程的状态267 8.2Thread类268 8.2.1Thread类的构造方法268 8.2.2Thread类的常用方法268 8.3多线程程序的编写...

    java面试题

    答:JDO是java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。 CORBA? 答:CORBA标准是公共对象请求代理结构,用途为:用不同的程序设计语言书写,在不同的...

    千方百计笔试题大全

    75、socket通信(tcp/udp区别及JAVA的实现方式) 18 76、什么是java序列化,如何实现java序列化? 18 77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private ...

    突破程序员基本功的16课.part2

    4.4.5 避免在经常调用的方法、循环中创建Java对象 4.4.6 缓存经常使用的对象 4.4.7 尽量不要使用finalize方法 4.4.8 考虑使用SoftReference 4.5 小结 第5课 表达式中的陷阱 5.1 关于字符串的陷阱 5.1.1 JVM...

Global site tag (gtag.js) - Google Analytics