《java JDK7 学习笔记》之异常处理
1、java中所有的错误都会被打包为对象,JVM会尝试执行try区块中的程序代码,如果发生错误,执行流程会跳离错误发生点,然后比较catch括号中声明的异常类型,是否符合被抛出的错误对象类型,如果是的话,就执行catch区块中的程序代码。
2、错误对象都继承自java.lang.Throwable类,Throwable定义了取得错误信息、堆栈追踪等方法,它有两个子类:java.lang.Error与java.lang.Exception。
3、Error与其子类实例代表严重系统错误,Error对象抛出时,基本上不用处理,任其传播至JVM为止,或者是最多留下日志信息。
4、通常程序中会使用try、catch加以处理的错误,都是Exception或其子类实例,所以通常称错误处理为异常处理,对于某些异常,可以try、catch语法尝试捕捉将应用程序恢复至可执行状态。
5、如果某个方法声明会抛出Throwable、Exception或子类实例,但又不属于java.lang.RuntimeException或其子类实例,就必须明确使用try、catch语法加以处理,或者用throws声明这个方法会抛出异常,否则会编译失败。
6、Throwable、Exception或其子对象,但非属于RuntimeException或其子对象,称为受检异常。
7、属于RuntimeException衍生出来的类实例,通常是事先无法预测错误是否发生的执行时期异常,编译程序不会强迫一定得在语法上加以处理,称为非受检异常。
8、如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块将永远不会被执行,编译程序会检查出这个错误。
9、从JDK7开始,可以使用多重捕捉语法,不过仍得注意异常的继承,catch括号中,左边的异常不能是右边异常的父类,否则会发生编译错误。
10、操作对象的过程中如果会抛出受检异常,但目前环境信息不足以处理异常,所以无法使用try、catch处理时,可由方法的客户端依据当时调用的环境信息进行处理。为了告诉编译程序这个事实,必须使用throws声明此方法会抛出的异常类型或父类型,编译程序才会允许通过编译。
11、如果是非受检异常,原本就可以自行选择是否处理异常,因此不使用try、catch处理时也不用特别在方法上使用throws声明,不处理非受检异常时,异常会自动往外传播。
12、在catch区块中进行完部分错误处理之后,可以使用throw(注意不是throws)将异常再抛出。
13、在JDK7中,编译程序对于重新抛出的异常类型可以更精准判断。
14、若想得知异常发生的根源,以及多重方法调用下异常的堆栈传播,可以利用异常对象自动收集的堆栈追踪来取得相关信息,例如调用异常对象的printStackTrace()、getStackTrace()等方法。
15、要善用堆栈追踪,前提是程序代码中不可有私吞异常的行为、对异常做了不适当的处理,或显示了不正确的信息。
16、在使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方。如果想要让异常堆栈起点为重抛异常的地方,可以使用fillInStackTrace(),这个方法会重新装填异常堆栈,将起点设为重抛异常的地方,并返回Throwable对象。
17、无论try区块中有无发生异常,若撰写有finally区块,则finally区块一定会被执行。如果程序撰写的流程中先return了,而且也有finally区块,finally区块会先执行完后,再将值返回。
18、在JDK7之后,新增了尝试关闭资源(try-with-resources)语法,想要尝试自动关闭资源的对象,是撰写在try之后的括号中。
19、若一个异常被catch后的处理过程引发另一个异常,通常会抛出第一个异常作为响应,addSupperssed()方法是JDK7在java.lang.Throwable中新增的方法,可将第二个异常记录在第一个异常之中,JDK7中与之对应的是getSupperssed()方法,可返回Throwable[],代表先前被addSupperssed()记录的各个异常对象。
20、JDK7的尝试关闭资源语法可套用的对象,必须操作java.lang.AutoCloseable接口,这是JDK7新增的接口。尝试关闭资源语法也可以同时关闭两个以上的对象资源,只要中间以分号分隔。在try的括号中,越后面撰写的对象资源会越早被关闭。
课后练习选择题:
1、public class Main{
public static void main(String[] args){
try{
int number = Integer.parseInt(args[0]);
System.out.println(number++);
}catch(NumberFormatException ex){
System.out.println(“必须输入数字”);
}
}
}
执行时若没有指定命令行自变量,以下描述正确的是:显示ArrayIndexOutOfBoundException堆栈追踪。
2、Object[] objs = {“java”,”7”};
Integer number = (Integer) objs[1];
System.out.println(number);
以下描述正确的是:显示ClassCastException堆栈追踪
3、public class Main{
public static void main(String[] args){
try{
int number = Integer.parseInt(args[0]);
System.out.println(number++);
}catch(NumberFormatException ex){
System.out.println(“必须输入数字”);
}
}
}
执行时若指定命令行自变量one,以下描述正确的是: 显示的必须输入数字。
4、public class FileUtil{
public static String readFile(String name) throws {
FileInputStream input = new FileInputStream(name);
return null;
}
}
方法名的throws关键字后要加FileNotFoundException ,声明该方法需要抛出找不到文件的异常。
5、public static String readFile(String name) {
try {
FileInputStream input = new FileInputStream(name);
} catch ( e) {
e.printStackTrace();
}
return null;
}
catch括号中描述正确的是:填入Throwable或者FileNotFoundException可以通过编译。
6、public class ExtendsDemo1 extends Resourse{
@Override
void doService() throws {}
public static void main(String[] args){
}
}
class Resourse{
void doService() throws IOException{}
}
红色区域填入Error、IOException、FileNotFoundException选项都可以通过编译。
7、public class Main{
public static void main(String[] args){
try{
int number = Integer.parseInt(args[0]);
System.out.println(number++);
}catch(ArrayIndexOutOfBouondException | NumberFormatException ex){
System.out.println(“必须输入数字”);
}
}
}
以下描述正确的是:显示”必须输入数字“。
8、public static void main(String[] args){
try{
int number = Integer.parseInt(args[0]);
System.out.println(number++);
}catch(RuntimeException | NumberFormatException ex){
System.out.println("必须输入数字");
}
}
以下描述正确的是:编译错误。
注:因为左侧Runtime是右侧NumberFormatException的父类。
9、public static String readFile(String name){
try( FileInputStream input = new FileInputStream(name)){
}
}
以下描述正确的是:编译失败、
10、try(ResourceSome some = new ResourceSome();
RsourceOther other = new ResouceOther()
)
以下描述正确的是:执行完try后先会关闭ResouceOther。
《java JDK7 学习笔记》之异常处理的更多相关文章
- 《java JDK7 学习笔记》之继承与多态
1.面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承.应该正确判断使用继承的时机及继承之后灵活的运用多态,才是学习继承时的重点. 2.程序代码重复在程序设计上,就是 ...
- 《java jdk7学习笔记》之java三大平台
Sun公司在2006年底,就将三大平台正名为java SE.java EE和java ME.也有很多人习惯用J2SE.J2EE和J2ME. 1.java SE java SE(标准版)是各应用平台的基 ...
- 《java JDK7 学习笔记》之Collection
一.使用Collection 收集对象 1.认识Collection架构 Java SE提供了满足各种需求的API,在使用这些API前,建议先了解其继承与接口操作架构,才能了解何时使用哪个类,以及类之 ...
- 《java JDK7 学习笔记》之接口与多态
1.对于"定义行为"也就是接口,可以使用interface关键字定义,接口中的方法不能操作,直接标示为abstract,而且一定是public修饰的. 类要操作接口,必须使用imp ...
- 《java JDK7 学习笔记》之对象封装
1.构造函数实现对象初始化流程的封装.方法封装了操作对象的流程.java中还可以使用private封装对象私有数据成员.封装的目的主要就是隐藏对象细节,将对象当做黑箱子进行操作. 2.在java命名规 ...
- 《java JDK7 学习笔记》之类和对象
1.在java中,要产生对象必须先定义类,类是对象的设计图,对象是类的实例.类定义时使用class关键词,建立实例对象要使用new关键词.以类名声明的变量,称为参考名称.参考变量或直接叫参考. 2.想 ...
- 《Java JDK7 学习笔记》课后练习题1
1.()组织负责监督审查Java相关技术规格的演进. A. JCP B. Apache C. EU D. W3C 2.Java技术规格必须以()正式文件提交审查. A. RFC B. JSR C. I ...
- 《Java JDK7 学习笔记》课后练习题2
1.如果在hello.java中撰写以下的程序代码: public class Hello { public static dmain(String[]args) { Sys ...
- 《java JDK7学习笔记》之跨平台与路径设置
Platforms表示Solaris.Linux.Windows各种操作系统平台,在这些平台上架构了java Virtaul Machine,简称JVM,Java虚拟机. Java虚拟机可以让java ...
随机推荐
- opendaylight的Beryllium安装
1.首先安装jdk #sudo apt-get install openjdk-7-jdk 2.安装vim编辑工具 #sudo apt-get install vim 3.编辑~/.bashrc ...
- 分享在winform下实现左右布局多窗口界面-续篇
之前的这篇文章<分享在winform下实现左右布局多窗口界面>已经实现了左右布局多窗口界面,今天本来是研究基于winform的插件编程,没想到顺便又找到了另一种实现方案,这种实现方案更简单 ...
- 使用VS Code开发 调试.NET Core 应用程序
使用VS Code开发 调试.NET Core RC2应用程序,由于.NET Core 目前还处于预览版. 本文使用微软提供的示例进行开发及调试. https://github.com/aspnet/ ...
- [WCF编程]11.错误:错误类型
一.错误概述 不管是哪一种操作,在任意时刻都可能出现不可预期的错误.问题在于我们应该如何将错误报告给客户端.异常和异常处理机制是与特定技术紧密结合的,不能跨越边界的.此外,如果有客户端来处理错误,必定 ...
- .Net中的并行编程-2.ConcurrentStack的实现与分析
在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...
- 在Hibernate框架中详谈一级缓存
在学习Hibernate的过程中我们肯定会碰上一个名词---缓存,一直都听说缓存机制是Hibernate中的一个难点,它分为好几种,有一级缓存,二级缓存和查询缓存 今天呢,我就跟大家分享分享我所理解的 ...
- c# asp.net4.0尚未在web服务器上注册
辗转无数论坛,感谢http://bbs.csdn.net/topics/390992746 microsoft官方文档: https://blogs.msdn.microsoft.com/webdev ...
- 如何在window下查看文件的md5
软件的话可以用Hash 不用软件,可以用window自带的命令行,首先在一个目录下按住Shift点击鼠标右键,调出CMD界面(或者直接win+R,cmd),命令行如下: certutil -hashf ...
- php实现设计模式之 访问者模式
<?php /** * 访问者模式 * 封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. * 行为类模式 */ /** 抽象访问者:抽象类或 ...
- 23、ASP.NET MVC入门到精通——业务层和数据层父类及接口-T4模板
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseB ...