Java学习日记9-异常
异常(Exception)
一、什么是异常?
异常就是程序中的错误,比如数组越界、访问空指针等。在Java中,一切皆对象,异常也不例外。所有的异常都是派生于Throwable类的一个实例对象。
二、异常的分类
在异常界,有两大流派。一派叫Error类,另一派叫Exception类,它们都继承自Throwable类。在Exception类下还有两大分支,IOException类和RuntimeException类。
RuntimeException是由程序本身的错误导致的异常。
IOException是程序本身没有问题,但是因为IO发生的错误引起的异常。
举例:
|
RuntimeException(unchecked) |
IOException(checked) |
|
数组访问越界 |
试图打开一个不存在的文件 |
|
访问空指针 |
试图在文件尾部读取数据 |
|
错误的类型转换 |
RuntimeException类和它的叔叔Error类比较亲,叔侄俩统称为未检查异常(unchecked Exception),大白话就是不用你检查,不用你管的异常。而IOException和它的兄弟和叔叔明显不是一路的,被称为已检查异常(checked Exception),就是你得管它。
三、异常处理(Exception handing)
前面说过未检查异常不用我们管,所以这里就只说我们怎么对付已检查异常。
(1)throws
首先,你得声明它。方法应该在其首部用throws+异常名声明所有可能抛出的异常。
抛出异常的4中情形:
1.调用一个抛出已检查异常的方法。
2.程序运行过程中发现错误,并且利用throws语句抛出已检查异常
3.程序出现错误,比如数组访问越界,会自动抛出ArrayIndexOutOfBoundsException
4.Java虚拟机和运行时库出现的内部错误
举个例子:
Class MyAnimation{
public Image LoadImage(String s)throws IOException, EOFException
{
......
}
}
(2)用throw关键字抛出异常
String readData(Scanner in)throws EOFException{
...
while(...){
if(!in.hasNext())
{
if(n<len)
throw new EOFException();
}
}
}
(3)自定义异常
当java提供的异常满足不了需要的时候,可以自己DIY一个
//定义一个FileFormatException类
class FileFormatException extends IOException{
public FileFormatException(){}
public FileFormatException(String gripe){
super(gripe);
}
}
//下面抛出自定义异常
String readData(Scanner in)throws EOFException
{
...
while(...){
if(ch == -1){
if(n<len)
throw new FileFormatException();
}
}
return s;
}
(4)捕获异常
光把异常抛出去,不能不管啊,所以就得捕获它并处理它。
//利用try-catch语句块捕获异常
try{
code
}
catch(ExceptionType e){
handler for this type
}
如果在try语句块中的代码抛出了一个在catch子句中说明的异常类,那么
1)程序将跳过try语句块的其他代码。
2)程序将执行catch子句中的处理器代码
(5)异常-方法内外
对于异常,可以在方法内部用try-catch语句块来捕获并处理,如果不想在方法内处理,可以在方法首部声明可能抛出的异常,将异常可能抛出的异常交给调用方法的代码去处理。总之,就是方法内用try-catch处理,方法外用throws抛出。
(6)捕获多个异常
try{
code
}
catch(FileNotFoundException | UnknowHostException e){
...
}
catch(IOException e){
...
}
(7)finally
try{
...
}
catch(IOException e){
...
}
finally{
...
}
不管有没有异常发生,finally语句块中的代码都将执行。
try-catch、try-catch-finally、try-finally三种组合,1、3组合更常用
(8)带资源的try语句块
带资源的try块在退出时,会自动关闭资源,这样往往就可以省掉finally语句
try(Scanner in = new Scanner(new FileInputStream(“文件路径”))){
while(in.hasNext())
System.out.println(in.next());
}
注:╮(╯▽╰)╭本文大量参考《Java核心技术 卷I》
Java学习日记9-异常的更多相关文章
- Java学习日记基础篇(九) —— 集合框架,泛型,异常
集合框架 有事我们会需要一个能够动态的调整大小的数组,比如说要添加新员工但是数组已经满了,并且数组的大小是在定义的时候定死的,所以我们就需要一个能够动态调整大小的数组或者用链表解决,而java中提供了 ...
- 1.13(java学习笔记)异常机制
异常不同于错误,它是程序运行时产生的未知问题. 如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常. 那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它 ...
- Java学习日记基础(五)——类、对象之this、静态变量(类变量)、静态方法(类方法)、四大特征
this 赵本山问奥尼尔:“我的爸爸的爸爸是谁?” 奥尼尔:“不知道” 赵本山:“你傻啊,是我爷爷” 奥尼尔回去问科比:“我的爸爸的爸爸是谁?” 科比:“不知道” 奥尼尔:”你傻啊,是赵本山的爷爷“ ...
- Java学习日记之 Java-其他类型
OK , 就绪, 第一篇博客开撸 ~ 先听了毕姥爷激情澎湃的其他类型 ,从这里开始入手吧 : (一)System类 System类代表系统类,系统的属性和方法都放在该类.System类是一个fina ...
- java学习面向对象之异常之二
我们知道当我们处理异常的时候,一个是声明,另外一个是捕捉. 捕捉:异常处理的捕捉方式,这是可以对异常进行针对性处理的方式.具体格式是: try { //需要被检测的异常 } catch(异常类 变量) ...
- java学习面向对象之异常之一
一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...
- Java学习日记-2.5 关于0和无穷
1. 无穷 Java中将无穷定义为浮点数,分为正负无穷,分别为POSITIVE_INFINITY和NEGATIVE_INFINITY 2. null null在java中可以理解为一个特殊的引用类型, ...
- Java学习日记-11 集合(1)
Collection接口集合中存储的只是对象的引用,不是对象本身. 1.ArrayList<E>类1.1ArrayList和Collection的关系 public interface L ...
- Java学习日记-2 零零碎碎
一.使用Scanner类进行控制台的输入 文档中Scanner类的定义为A simple text scanner which can parse primitive types and string ...
随机推荐
- Gson解析json数据(转)
一. www.json.org这是JSON的官方网站. 首先,我,我们需要在code.google.com/p/google-gson/downloads/list下载JSON的jar包,解析后把gs ...
- Verilog之event的用法
编写verilog的testbench时,可使用event变量触发事件. event变量声明为: event var; event触发为: ->var; 捕获触发为: @(var); 在mode ...
- this,super关键字的使用
this关键字 1.this是对象的别名,是当前类的实例引用 2.在类的成员方法内部使用,代替当前类的实例.在Java中,本质上是指针,相当于C++中的指针概念.如果方法中的成员在调用前没有操作实例名 ...
- windows 8.1 administrator相关设置
一.windows 8.1 开启administrator用户 windows8.1中文版,由于默认不开启administrator用户,所以需要自己手动开启 启用administrator:在cmd ...
- Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view...
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tabl ...
- C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体
//浏览图片 private void btnUp_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialo ...
- 四、C#方法和参数
方法是一种组合一系列语句以执行一个特定操作或计算一个特殊结果的方式. 它能够为构成程序的语句提供更好的结构和组织. 在面向对象的语言中,方法总是和类关联在一起的,我们用类将相关的方法分为一组. 方 ...
- STL容器介绍
STL的容器可以分为以下几个大类: 一:序列容器, 有vector, list, deque, string. 二 : 关联容器, 有set, multiset, map, mulmap, h ...
- log4net编译后命名空间找不到的问题
log4net编译后命名空间找不到的问题问题:工程A添加dll引用后,可以在代码中引入log4net的命名空间.工程B引用A.A能编译成功,B不能编译成功,提示找不到命名空间. 解决: 点击项目属性- ...
- oracle删除互相关联的记录
今天遇到一个问题,在数据库中删除一条记录,但是在删除的时候报错了,报出该记录已经被其他子记录引用,想了好久不知道怎么做,后来发现报错提示信息中会提示删除该记录时影响了那个约束条件,于是思路出来了: 1 ...