Java笔记 #02# 带资源的try语句
索引
/
test.txt
待读取的内容
hello.
/
普通的 try.java
读取 test.txt 内容
package example; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class GeneralTry {
public static void main(String[] args) {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream("d:/labs/test.txt");
System.out.println((char) inputStream.read()); // 输出读到第一个字符,至于会不会与txt文本内容对应还与txt本身的字符编码相关。
} catch (FileNotFoundException e) { // 捕获异常是强制性的,对应 new FileInputStream...
e.printStackTrace();
} catch (IOException e) { // 捕获异常是强制性的,对应 inputStream.read ..
e.printStackTrace();
} finally { // 关闭资源是非强制性的,但是我们应该总是这么做
try {
inputStream.close();
if (inputStream != null) { // inputStream 有可能为空,为了防止出现空指针而导致程序gg ..
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("如果在输出窗看到这句话,说明程序没有gg");
}
} /*
output=
h
如果在输出窗看到这句话,说明程序没有gg
*/
/
带资源的 try.java
同样是读取 test.txt 内容
package example; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class ResourceTry {
public static void main(String[] args) {
try (FileInputStream inputStream = new FileInputStream("d:/labs/test.txt")) {
System.out.println((char) inputStream.read()); // 输出读到第一个字符,至于会不会与txt文本内容对应还与txt本身的字符编码相关。
} catch (FileNotFoundException e) { // 捕获异常仍然是强制的
e.printStackTrace();
} catch (IOException e) { // 捕获异常仍然是强制的
e.printStackTrace();
} // try 块退出时,会自动调用 inputStream.close()
System.out.println("如果在输出窗看到这句话,说明程序没有gg");
}
} /*
output=
h
如果在输出窗看到这句话,说明程序没有gg
*/
/
上述程序(带资源的 try程序)是在正常情况下(test.txt 文件存在)运行的,那么倘若 test.txt 不存在呢?尝试把 test.txt 改成一个不存在的 test2.txt 运行带资源的 try 测试程序输出结果如下:
/*
output=
如果在输出窗看到这句话,说明程序没有gg
java.io.FileNotFoundException: d:\labs\test2.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at example.ResourceTry.main(ResourceTry.java:10)
*/
如果第一个程序(普通 try)没有在 inputStream.close() 之前进行非空检查,程序将会因为 java.lang.NullPointerException 而中止(也就是gg)。
就像上面看到的,带资源的 try 测试程序同样可以正常向下执行,所以,带资源的 try 在调用 close() 前是有进行非空判断的,这样就确保了程序正常执行而不抛出 NullPointerException,需要注意的是,除了空指针异常不会发生, close() 抛出的其它异常需要另当别论!
/
可以参考的文档与资料:
Try-With Resource when AutoCloseable is null
Possible null pointer exception on autocloseable idiom
The try-with-resources Statement - java tutorials - oracle
Java language specification - 14.20.3
oracle blog - Project Coin:try-with-resources on a null resource
再补充几个:
Exception coming out of close() in try-with-resource
Is it important to add AutoCloseable in java?
How should I use try-with-resources with JDBC?
Java笔记 #02# 带资源的try语句的更多相关文章
- 066 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参有返回值方法
066 01 Android 零基础入门 01 Java基础语法 08 Java方法 04 带参有返回值方法 本文知识点:带参有返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...
- 065 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参无返回值方法
065 01 Android 零基础入门 01 Java基础语法 08 Java方法 03 带参无返回值方法 本文知识点:带参无返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...
- java笔记02
一,编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数 /** * */ package 课堂2; import java.util.Random; /** * @author 信16 ...
- Java:并发笔记-02
Java:并发笔记-02 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 3. 共享模型之管程-1 本章内容-1 共享问题 synchronized 线程安全分 ...
- 在Java中编写带占位符的SQL语句
C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...
- java 自动关闭资源的try语句
Java 7简化资源清理(try-with-resources)自动关闭资源的try语句 自动关闭资源格式: try( )//此处多了圆括号,()圆括号内写打开资源的代码,在这里创建的对象必须实现Au ...
- 064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法
064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法 本文知识点:无参带返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...
- Java笔记——循环语句
Java笔记--循环语句 1. while语句 规律: 1. 首先计算表达式的值. 2. 若表达式为真,则执行循环语法,直至表达式为假,循环结束. while(表达式) 语句; 例如: i ...
- java笔记整理
Java 笔记整理 包含内容 Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...
随机推荐
- Django之数据聚合函数 annotate
在我们的博客侧边栏有分类列表,显示博客已有的全部文章分类.现在想在分类名后显示该分类下有多少篇文章,该怎么做呢?最优雅的方式就是使用 Django 模型管理器的annotate方法. 模型回顾 回顾一 ...
- TOP100summit 2017 七牛云许式伟:不用JAVA和C语言,我为什么坚持Go语言
本文编辑:Cynthia 2009年,谷歌发布第二款开源编程语言,Go语言.8年过去了,很多初创公司早期使用Go进行开发,包括云计算巨头Docker.而Go语言在中国的普及程度还比不上JAVA和C语言 ...
- octomap的简介
装载自高翔博士的博客:https://www.cnblogs.com/gaoxiang12/p/5041142.html 什么是octomap? RGBD SLAM的目的有两个:估计机器人的轨迹,并建 ...
- Django模板变量的使用
在views.py中进行逻辑控制,编写向跳转页面传递内容的代码.可以看出,对类.字典.列表中的数据均可操作.views.py的内容如下: from django.shortcuts import re ...
- CCCC L2-002. 链表去重
https://www.patest.cn/contests/gplt/L2-002 模拟一个链表的去重操作 题解:别模拟了,直接用内置的list和map.关于输出的地址,直接用pair存地址和值,输 ...
- 2018/04/04 PHP 中的 数组排序问题
简单说一下为什么要总结一下PHP中关于数组排序的问题. 在很多时候我们对于数组要进行排序,但是 PHP 中对于排序已经有了很多封装. 但是某些函数是修改原数组,一部分是返回修改后数组,与其一个个试,不 ...
- LoadRunner-参数化(连接数据库)
多用户并发测试,用户信息来自数据库,对脚本中accounts值替换为参数后,打开参数列表. 1.点击 Data Wizard...:选择Specify SQL statement manu: 2.点击 ...
- Tomcat的overview界面浅析
Server Locations配置有三个选项(加载位置): 1. Use workspace metadata (does not modify Tomcat installation); 2. U ...
- (3.3)mysql基础深入——mysql启动深入分析
基础:(2.1)学习笔记之mysql基本操作(启动与关闭) 0.mysql启动的 3种方式 (1)mysql.server (2)mysqld_safe (3)mysqld 1.启动分析 [1.1]概 ...
- SqlServer 凭据
一.理解索引的结构 索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度.使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据.微软的SQL SERVER提供了两种索引:聚集索引 ...