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 ...
随机推荐
- c++中inline函数的意义
inline C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数.关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声 ...
- MapReduce的计数器
第一部分.Hadoop计数器简述 hadoop计数器: 可以让开发人员以全局的视角来审查程序的运行情况以及各项指标,及时做出错误诊断并进行相应处理. 内置计数器(MapReduce相关.文件系统相关 ...
- @log的decorator完美实现(原创)
# -*- coding: utf-8 -*- from functools import wraps from inspect import isfunction def beforecalled( ...
- $obj
<?php $obj = new stdClass(); for($w=0; $w<10; $w++){ $obj->$w= $w.'w'; $str = $w.'we'; $obj ...
- 经典的DOS小命令 for 网络 nbtstat
--网络scanner · 1.最基本,最常用的,测试物理网络的 ping 192.168.10.59 -t ,参数-t是等待用户去中断测试 2.查看DNS(对猫用户),还是比较有用处的 A.Win9 ...
- Guideline 2.1 - Information Needed
For information about testing your app and preparing it for review, please see Technical Note TN2431 ...
- elasticsearch的重启
没有重启的操作,只有关闭了再启动的操作. ps -ef | grep elastic e表示全部的进程,f表示展示进程间的相关关系,如父子进程. 然后找到你启动es的那个账号,不是root,一般是新建 ...
- Find a way--hdu2612
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2612 广搜题 注意:可能存在一个@两人都不能达到: 3 3 Y#@ .M# @.. #include ...
- dedecms网站迁移时记得将安装目录放空 附迁移的正确方法
这段时间在赶一些新项目,我们建站一般都在本地服务器搭建起来,测试得差不多了才传到网上,这样对蜘蛛也相对友好一些,要不然改来改去变化太大给搜索引擎的第一印象很不好.但是由于本地环境和服务器环境还是有一些 ...
- 【剑指offer】用两个栈实现队列
一.题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 二.思路: 两个栈A,B,A负责进栈,B负责出栈,进栈很容易,A中添加即可,出栈需要从B里出,所以要先 ...