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 ...
随机推荐
- DevOps的概念
DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整合.它的出现是 ...
- IIS 下载文件 报错“401 - 未授权: 由于凭据无效,访问被拒绝。”
点开身份验证 改为启用就OK了 重启一下IIS. 如果你上在办法没有解决可参考 1.打开“IIS信息服务管理器”——>选择你发布的网站——>选择功能视图中的“身份验证”——>右键匿名 ...
- 基础知识系列☞C#中→委托
有些.NET中的高级特性,比如:委托! 有一种怎么也搞不懂的赶脚... 博客读了好几篇,代码也动手写了,书中的一些介绍也看了, 各种搜索关于委托的,至今还处于"会用"的阶段. 该怎 ...
- css实现简单几何图形
前言:你知道吗?用代码就可以做出三角形.圆形.扇形等等这些几何图形呦.快过来一探究竟吧! 页面上一些简单的图形,如三角形.圆形等等,除了用图片来实现,我们还可以用css的border属性来实现,不仅减 ...
- C++中的类成员指针
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 图论——最小生成树_prim
今天是最小生成树的prim的算法,因为本人水平有限所以堆优化都不是很会啊,但邻接表好像出了点小差错所以上邻接矩阵比较好一点,尽管比Kruskal慢了很多很多但这种贪心思想还是要学习的.从第一条边开始取 ...
- 数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)
https://blog.csdn.net/fuqiuai/article/details/79456971 相关文章: 数据挖掘领域十大经典算法之—K-Means算法(超详细附代码) ...
- hibernate注解(三)1+N问题
一.什么时候会遇到1+N的问题? 前提:Hibernate默认表与表的关联方法是fetch="select",不是fetch="join",这都是为了懒加载而准 ...
- Java-SpringMvc-响应Html代码展示
代码 @RequestMapping(value = "/test.do", method = {RequestMethod.GET}) public void test(Http ...
- 解决PHPStorm经常卡顿现象 调整内存限制
https://www.jisec.com/other/451.html 为什么调整内存? 最近发现PHPstorm在打开一些大点的js, html文件时,会非常的卡顿,这个主要的原因是因为设置的内存 ...