JavaNote7
1. 异常
1.1 异常概述
异常:.就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是 java 按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。
1.2 异常体系
- java.lang.Throwable
- Error:表示错误,一般指JVM相关的不可修复的错误,如,系统崩溃,内存溢出,JVM错误等,由JVM抛出,我们不需要处理.几乎所有的子类都是以Error作为类名的后缀.
- Exception:表示异常,指程序中出现不正常的情况,该问题可以修复(处理异常).几乎所有的子类都是以Exception作为类名的后缀.
常见的Error:
StackOverflowError:当应用程序递归太深而发生内存溢出时,抛出该错误。
常见的Exception:
NullPointerException:空指针异常,一般指当对象为null的时候,调用了该对象的方法,字段.
ArrayIndexOutOfBoundsException:数组的索引越界,(小于0或者大于等于数组长度)
NumberFormatException:数字格式化异常, 一般指,把非0~9的字符串转换为整数.
1.3 捕获异常
处理方式有两种:1捕捉(try-catch);2抛出(throws)。
对于捕捉:java 有针对性的语句块进行处理。
//使用try-catch捕获单个异常,语法如下:
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
注意:try和catch都不能单独使用,必须连用.
//使用try-catch捕获多个异常:
try{
编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
注意:
1:一个catch语句,只能捕获一种类型的异常,如果需要捕获多种异常,就得使用多个catch语句.
2):代码在一瞬间只能出现一种类型的异常,只需要一个catch捕获,不可能同时出现多个异常.
//获取异常信息
catch (Exception e) { //e 用于接收 try 检测到的异常对象。
System.out.println("message:"+e.getMessage());//获取的是异常的信息。
System.out.println("toString:"+e.toString());//获取的是异常的名字+异常的信
息。
e.printStackTrace();//打印异常在堆栈中信息;异常名称+异常信息+异常的位置。
}
异常处理原则:功能抛出几个异常,功能调用如果进行 try 处理,需要与之对应的 catch处理代码块,这样的处理有针对性,抛几个就处理几个。
特殊情况:try 对应多个 catch 时,如果有父类的 catch 语句块,一定要放在下面。
1.4 finally代码块
finally语句块表示最终都会执行的代码,无论有没有异常.
什么时候的代码必须最终执行:
当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,最终关闭打开的资源.finally的两种语法:
- 1):try…finally: 此时没有catch来捕获异常,因为此时根据应用场景,我们会抛出异常,自己不处理.
- 2):try…catch….finally:自身需要处理异常,最终还得关闭资源.
注意:finally不能单独使用.
当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行.如:System.exit(0);//退出JVM
1.5 异常分类
- 异常(Exception)的分类:根据在编译时期还是运行时期去检查异常.
- 1):编译时期异常:checked异常.在编译时期,就会检查,如果没有处理异常,则编译失败.
- 2):运行时期异常:runtime异常.在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错).运行异常:在编译时期,可处理,可不处理.
- checked异常和runtime异常的区别:
- 编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
声明的原因:是需要调用者对该异常进行处理。 - 运行时异常如果在函数内被抛出,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
- 编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
1.6 抛出异常
抛出异常:
throw: 运用于方法内部,用于给调用者返回一个异常对象,和return一样会结束当前方法.
throws: 运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
throw 和 throws 关键字的区别:
throw 用于返回异常对象,后面跟的是异常对象;throw 用在函数内。
throws 用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws 用
在函数上。
通常情况:函数内容如果有 throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。
- 定义异常处理时,什么时候定义 try,什么时候定义 throws 呢?
- 功能内部如果出现异常,如果内部可以处理,就用 try.
- 如果功能内部处理不了,就必须声明出来,让调用者处理。使用throws 抛出,交给调用者处理。谁调用了这个功能谁就是调用者.
1.7 自定义异常类
自定义异常的步骤:
1:定义一个子类继承 Exception 或 RuntimeException,让该类具备可抛性(既可以
使用 throw 和 throws 去调用此类)。
2:通过 throw 或者 throws 进行操作。
异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用
者可以处理的异常抛出。
1.8 其他
异常转译和异常链:
异常转译:当位于最上层的子系统不需要关心底层的异常细节时,常见的做法是捕获原始的异常,把它转换为一个新的不同类型的异常,再抛出新的异常.
异常链:把原始的异常包装为新的异常类,从而形成多个异常的有序排列,有助于查找身材异常的根本原因.
Java7的异常新特性
- 增强的throw
- 多异常捕获
- 自动资源关闭
处理异常的原则:
- 1:异常只能用于非正常情况,try-catch的存在也会影响性能.
- 2:需要为异常提供说明文档,比如Java doc,如果自定义了异常或某一个方法抛出了异常,我们应该记录在文档注释中..
- 3:尽可能避免异常.
- 4:异常的粒度很重要,应该为一个基本操作定义一个 try-catch 块,不要为了简便,将几百行代码放到一个 try-catch 块中.
- 5:不建议在循环中进行异常处理,应该在循环外对异常进行捕获处理(在循环之外使用try-catch).
- 6:自定义异常尽量使用RuntimeException类型的.
2. 包(package)
2.1 包的概述
- 包:定义包用 package 关键字
- 1.对类文件进行分类管理。
- 2.给类提供多层命名空间。
- 3.写在程序文件的第一行。
- 4.类名的全称的是 包名.类名。
- 5.包也是一种封装形式。
package cn.itcast.pack.demo;//定义了一个包。注意:包名的写法规范:所有字母都小写,一般写成公司域名倒写。
类的全名称是 包名.类名
编译命令:javac –d 位置(.当前路径) java 源文件 (就可以自动生成包)
2.2 常见的软件包
- java.lang : language java 的核心包,Object System, String Throwable jdk1.2版本后,该包中的类自动被导入。
- java.awt : 定义的都是用于 java 图形界面开发的对象。
- javax.swing: 提供所有的 windows 桌面应用程序包括的控件,比如:Frame ,Dialog, Table, List 等等,就是 java 的图形界面库。
- java.net : 用于 java 网络编程方面的对象都在该包中。
- java.io : input output 用于操作设备上数据的对象都在该包中。比如:读取硬盘数据,往硬盘写入数据。
- java.util : java 的工具包,时间对象,集合框架。
- java.applet: application+let 客户端 java 小程序。server+let –> servlet 服务端 java 小程序。
最后附上Java学习网址