`
FlyingFairy
  • 浏览: 12670 次
  • 性别: 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();
}

相关推荐

    qq网络通信JAVA源码

    Java的异常处理机制(try-catch-finally)用于捕获并处理运行时错误,而`java.util.logging`或第三方库如Log4j则用于记录程序运行过程中的信息,便于调试和追踪问题。 总的来说,这个QQ网络通信JAVA源码涵盖了网络...

    Java异常处理的五个关键字

    Java 异常处理的五个关键字是 try、catch、finally、throw 和 throws,这五个关键字是 Java 异常处理中最重要的组成部分。 一、try 关键字 try 关键字用于定义需要监听的代码块,这个代码块可能会抛出异常。在 try...

    2021年JAVA面向对象程序设计练习题库B.doc

    在 Java 中,我们可以使用 extends 关键字来实现继承。 Java 中的多态性是指一个对象可以拥有多种形态。例如,我们可以使用同一个方法名来实现不同的操作。在 Java 中,我们可以使用方法重载和方法覆盖来实现多态...

    通信系统(Java)

    在这个特定的案例中,我们讨论的是一个使用Java编程语言实现的即时通信系统。Java因其跨平台兼容性和丰富的类库,成为了开发此类系统的理想选择。下面将详细探讨这个Java实现的即时通信系统及其相关知识点。 1. **...

    Java解惑(中文版)_java_java解惑_solve65p_

    《Java解惑(中文版)》是一本专为Java初学者设计的学习资料,旨在帮助读者解答在学习Java过程中遇到的各种困惑。"solve65p"可能代表这本书包含65个问题或主题,每个都深入浅出地进行了讲解,旨在解决初学者在编程...

    java一对一通信

    在Java编程中,一对一通信(One-to-One Communication)通常指的是两个独立的进程或线程之间进行数据交换的方式。在这个场景中,"用户"和"服务器"通过交替发送和接收消息来实现通信,确保了交互的实时性和顺序性。多...

    自考java 04747《Java语言程序设计(一)》教材电子版

    线程间通信(如synchronized关键字、wait()、notify()方法)是多线程编程中需要重点掌握的内容。 在自考Java的过程中,除了理解和掌握以上知识点,还需要大量实践以提高编程能力。通过编写小程序、参与项目开发,...

    Java SCJP中文学习指南

    理解流的概念,以及如何读写文件、网络通信等是Java开发的基本技能。 七、多线程 Java提供了内置的多线程支持,通过Thread类和Runnable接口实现。理解线程的生命周期、同步机制(如synchronized关键字、wait()、...

    java 五子棋 课程设计 网络通信 socket

    - **异常处理**:良好的错误处理机制可以保证程序在遇到异常情况时能稳定运行,Java的try-catch-finally结构用于捕获和处理可能出现的异常。 2. **五子棋游戏逻辑**: - **棋盘表示**:通常使用二维数组来存储...

    JAVA多线程通信学习_服务器多线程通信_

    在Java中,共享内存通常通过 volatile 关键字、synchronized 关键字和锁(如 ReentrantLock)来实现。volatile 可以确保多个线程间对变量的可见性和有序性;synchronized 提供了互斥访问,确保同一时刻只有一个线程...

    Java核心技术-基础知识(第8版中文版)core java

    在Java中,类通过关键字`class`来定义,对象则通过`new`操作符来创建。理解类与对象的关系以及如何设计和使用它们是掌握Java编程的关键。 其次,接口在Java中扮演着重要的角色,它是一种完全抽象的类型,仅包含常量...

    java sun公司的中文教程

    - 讲解Java语言中标识符、关键字和数据类型的使用规则。 - 探讨如何使用集合数据类型来实现面向对象的数据关联。 3. **表达式和流程控制** - 分析运算符的工作原理。 - 介绍用于控制Java程序流程的句法结构。 ...

    资深工程师整理面试题:Java

    在 Java 中,可以使用 synchronized 关键字来实现同步。 3. Java 中的异常处理机制 答:Java 中的异常处理机制是通过 try-catch-finally 语句来实现的。当出现异常时,程序可以抛出异常,然后在 catch 块中处理...

    Java基于Socket局域网聊天软件

    Socket在Java中是网络通信的基础,它提供了一种低级别的、面向连接的、双向的通信机制,使得应用程序能够通过TCP/IP协议发送和接收数据。下面我们将深入探讨相关的Java网络编程知识点。 1. **Java Socket API**: ...

    Java课件 Java课件 Java课件

    课件可能会介绍线程的创建、同步和通信,包括synchronized关键字、wait()、notify()和notifyAll()方法,以及更高级的并发工具如Semaphore和CyclicBarrier。 除此之外,Java标准库提供了大量的API供开发者使用,例如...

    java入门基础部分总概思维导图

    * Java的异常处理机制包括`try`、`catch`、`finally`三个块。 * Java的异常可以分为checked exception和unchecked exception两种。 * Java的异常处理机制可以通过`throws`关键字来声明可能抛出的异常。 Java多线程...

    Java code Java code

    4. **多线程**:"j02130604.java"可能涉及并发编程,Java提供了Thread类和Runnable接口来创建和管理线程,以及synchronized关键字、volatile变量等用于线程间的同步和通信。 5. **集合框架**:"j02130802.java"和"j...

    java函数中文速查手册

    `try-catch-finally`结构则是异常处理的主要方式,确保程序在遇到错误时能优雅地处理。 速查手册通常按照函数的类别和功能进行分类,便于用户根据需求快速定位。例如,你可以找到关于字符串处理的`String`类方法,...

    Java写的围棋游戏的源代码.pdf

    * Java中的继承机制:extends关键字、父类和子类的关系 * Java中的接口机制:implements关键字、接口的定义和实现 二、Java AWT组件 * Frame组件:java.awt.Frame类,用于创建窗口 * Panel组件:java.awt.Panel类...

    java书籍head first java

    7. **线程**:Java支持多线程编程,书中会介绍线程的创建、同步和通信,如synchronized关键字和wait/notify机制。 8. **输入输出流**:讲解如何进行文件操作和网络通信,包括FileInputStream、FileOutputStream、...

Global site tag (gtag.js) - Google Analytics