最近在学习简单的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语言规范更好,,先就到这,我还是去写安卓通信去了。。。
相关推荐
Java的异常处理机制(try-catch-finally)用于捕获并处理运行时错误,而`java.util.logging`或第三方库如Log4j则用于记录程序运行过程中的信息,便于调试和追踪问题。 总的来说,这个QQ网络通信JAVA源码涵盖了网络...
Java 异常处理的五个关键字是 try、catch、finally、throw 和 throws,这五个关键字是 Java 异常处理中最重要的组成部分。 一、try 关键字 try 关键字用于定义需要监听的代码块,这个代码块可能会抛出异常。在 try...
在 Java 中,我们可以使用 extends 关键字来实现继承。 Java 中的多态性是指一个对象可以拥有多种形态。例如,我们可以使用同一个方法名来实现不同的操作。在 Java 中,我们可以使用方法重载和方法覆盖来实现多态...
在这个特定的案例中,我们讨论的是一个使用Java编程语言实现的即时通信系统。Java因其跨平台兼容性和丰富的类库,成为了开发此类系统的理想选择。下面将详细探讨这个Java实现的即时通信系统及其相关知识点。 1. **...
《Java解惑(中文版)》是一本专为Java初学者设计的学习资料,旨在帮助读者解答在学习Java过程中遇到的各种困惑。"solve65p"可能代表这本书包含65个问题或主题,每个都深入浅出地进行了讲解,旨在解决初学者在编程...
在Java编程中,一对一通信(One-to-One Communication)通常指的是两个独立的进程或线程之间进行数据交换的方式。在这个场景中,"用户"和"服务器"通过交替发送和接收消息来实现通信,确保了交互的实时性和顺序性。多...
线程间通信(如synchronized关键字、wait()、notify()方法)是多线程编程中需要重点掌握的内容。 在自考Java的过程中,除了理解和掌握以上知识点,还需要大量实践以提高编程能力。通过编写小程序、参与项目开发,...
《Java 1.6.0 API中文参考文档》是一份对于Java编程者极其重要的资源,它详尽地列出了Java 1.6.0版本的所有公共类、接口、方法和异常,是开发者在编程过程中不可或缺的工具书。下面将详细阐述这份文档中包含的重要...
- **异常处理**:良好的错误处理机制可以保证程序在遇到异常情况时能稳定运行,Java的try-catch-finally结构用于捕获和处理可能出现的异常。 2. **五子棋游戏逻辑**: - **棋盘表示**:通常使用二维数组来存储...
在Java中,共享内存通常通过 volatile 关键字、synchronized 关键字和锁(如 ReentrantLock)来实现。volatile 可以确保多个线程间对变量的可见性和有序性;synchronized 提供了互斥访问,确保同一时刻只有一个线程...
在Java中,类通过关键字`class`来定义,对象则通过`new`操作符来创建。理解类与对象的关系以及如何设计和使用它们是掌握Java编程的关键。 其次,接口在Java中扮演着重要的角色,它是一种完全抽象的类型,仅包含常量...
- 讲解Java语言中标识符、关键字和数据类型的使用规则。 - 探讨如何使用集合数据类型来实现面向对象的数据关联。 3. **表达式和流程控制** - 分析运算符的工作原理。 - 介绍用于控制Java程序流程的句法结构。 ...
在 Java 中,可以使用 synchronized 关键字来实现同步。 3. Java 中的异常处理机制 答:Java 中的异常处理机制是通过 try-catch-finally 语句来实现的。当出现异常时,程序可以抛出异常,然后在 catch 块中处理...
Socket在Java中是网络通信的基础,它提供了一种低级别的、面向连接的、双向的通信机制,使得应用程序能够通过TCP/IP协议发送和接收数据。下面我们将深入探讨相关的Java网络编程知识点。 1. **Java Socket API**: ...
* Java的异常处理机制包括`try`、`catch`、`finally`三个块。 * Java的异常可以分为checked exception和unchecked exception两种。 * Java的异常处理机制可以通过`throws`关键字来声明可能抛出的异常。 Java多线程...
4. **多线程**:"j02130604.java"可能涉及并发编程,Java提供了Thread类和Runnable接口来创建和管理线程,以及synchronized关键字、volatile变量等用于线程间的同步和通信。 5. **集合框架**:"j02130802.java"和"j...
`try-catch-finally`结构则是异常处理的主要方式,确保程序在遇到错误时能优雅地处理。 速查手册通常按照函数的类别和功能进行分类,便于用户根据需求快速定位。例如,你可以找到关于字符串处理的`String`类方法,...
* Java中的继承机制:extends关键字、父类和子类的关系 * Java中的接口机制:implements关键字、接口的定义和实现 二、Java AWT组件 * Frame组件:java.awt.Frame类,用于创建窗口 * Panel组件:java.awt.Panel类...
7. **线程**:Java支持多线程编程,书中会介绍线程的创建、同步和通信,如synchronized关键字和wait/notify机制。 8. **输入输出流**:讲解如何进行文件操作和网络通信,包括FileInputStream、FileOutputStream、...
在Java中,我们可以使用try-catch-finally语句块来捕获并处理异常。 7. **并发控制**: 在多线程环境中,需要考虑线程安全问题。Java提供了synchronized关键字和各种锁机制,以防止数据竞争和不一致状态。聊天器的...