第五章:异常
第五章:异常
异常就是在程序运行过程中所发生不正常的事件,如所需文件找不到,网络连接不通或中断,算术运算符出错(如被零除),数组下标越界,装载了一个不存在的类,对null对象操作,类型转换异常等。异常会中断正在运行的程序。
异常分为编译错误,运行错误和逻辑错误。
1.异常处理
java的异常处理通过五个关键字来实现的:try,catch,finally,throw和throws。
语法:
try{
// 程序代码
}catch(ExceptionName e1){
//Catch 块
}
常见的异常类型:
异常 | 说明 |
---|---|
Exception | 异常层次结构的根类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
InputMismatchException | 欲得到的数据类型与实际输入的类型不匹配 |
IIIegalArgumentException | 方法接受到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把‘abc’装换成数字 |
2.try-catch-finally块
public static void main(String[] args) {
Scanner in = new Scanner (System.in);
System.out.println("请输入被除数");
try {
int num1 = in.nextInt();
System.out.println("请输入除数");
int num2 = in.nextInt();
System.out.println(String.format("%d/%d=%d",num1,num2,num1/num2));
} catch (Exception e) {
System.out.println("出现错误:被除数和除数必须是整数"+"除数不能为零");
System.exit(1);//finally语句唯一不被执行的情况
}finally {
System.out.println("感谢使用本程序!");
}
}
处理异常手段:
1、try…catch…finally
2、try:监控代码,监控可能发生错误的代码
3、如果try里面代码没有发生异常,则整个try执行完毕,一定进入catch
4、如果try里面有异常,则try里面后面的代码不会执行,如果有对应的cathch一定会进入catch
catch:捕获catch里面指定类的异常
1、语法:catch(类名 对象名),类名–》异常的类名
catch(Exception ex)
2、catch可以一次性出现多个
要求:子类必须在父类的前面;catch后面的类型不能出现相同的
结果:只会执行一个,第一次匹配的执行
3,finally:不管执行的try还是catch都最后一定的执行的代码
如果遇到了System.eixt(1);不会执行finally
除非finally里面的代码也出现异常
3.throws
通过throws抛出异常
定义一个方法的时候可以使用throws关键字声明。使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。
public static void divide() {
Scanner in = new Scanner (System.in);
System.out.println("请输入被除数");
int num1=in.nextInt();
System.out.println("请输入除数");
int num2 = in.nextInt();
System.out.println(String.format("%d/%d=%d",num1,num2,num1/num2));
}
public static void main(String[] args) {
try {
divide();
} catch (Exception e) {
System.out.println("出现错误:被除数和除数必须是整数,"+"除数不能为零");
e.printStackTrace();
}
}
通过try-catch捕获处理异常。
通过throws继续声明异常。如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级处理。
4.throw
throw关键字抛出异常
throw关键字作用是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象,在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。
public class Person {
private String name="";//姓名
private int age=0;//年龄
private String sex ="男";
public void setSex(String sex)throws Exception {
if ("男".equals(sex)||"女".equals(sex)) {
this.sex=sex;
}else {
throw new Exception("性别必须是\"男\"或者\"女\"!");
}
}
public void print() {
System.out.println(this.name+"("+this.sex+","+this.age+"岁)");
}
public static void main(String[] args) {
Person person = new Person();
try {
person.setSex("男");
person.print();
} catch (Exception e) {
e.printStackTrace();
}
}
}
throw和throws的区别表现在三个方面。
作用不同:throw用于在程序中抛出异常;throws用于声明在该方法内抛出了异常。
使用位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表后面,不能单独使用。
内容不同:throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个。
5.异常的分类
Throwable类:所有的异常类型都是Throwable的子类,它派生两个子类,即Error和Exception。
Error类:表示仅靠程序本身无法恢复严重错误。
Exception类:由java应用程序抛出和处理非常严重的错误,如所需文件找不到,网络连接中断,算术运算符出错,数组下标越界。
6.开源日志记录工具log4j
MyEclipse中使用log4j的四个步骤:
1.在项目中加入log4j所使用的jar文件。
2.创建log4j.properties文件。
3.编写log4j.properties文件,配置日志信息。
4.在程序中使用log4j记录日志信息。
日志分为三类:
SQL日志:记录系统执行的SQL语句。
异常日志:记录系统运行中发生的异常事件。
业务日志:记录系统运行过程,如用户登录,操作记录。
日志记录,分等级:【从小到大】
debug调试<info信息<warn警告<error错误<fatal严重错误
异常时由java应用程序抛出和处理的非常严重的错误,它可以分为Checked异常和运行时异常两大类。
Cheked异常必须捕获或者声明抛出,否则无法通过编译。运行时异常不要球必须捕获或者声明抛出。
第六章:集合框架
所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
集合框架是为表示操作集合而规定的一种统一的标准体系结构。集合框架包含三大块内容:对外接口,接口和实现和对集合运算的算法。
java框架集合简图。
Collection接口存储一组不唯一(允许重复)无序的对象。
Set接口继承Collection接口,存储一组唯一(不予许重复)无序的对象。
List接口继承Collection接口,存储一组不唯一(允许重复)有序(一元素插入的次序来存放置元素,不会重新排列)的对象。
Map接口存储一组成对的键一值对象,提供key到value的映射。Map中的key不要求有序,不予许重复。value同样不要求有序,但允许重复。
lterator接口是负责定义访问和遍历元素的接口。
1.List接口
实现List接口的常用类有ArrayList和LinkedList。它们都可以容纳所有类型的对象,包括null允许重复,并且都保证元素的存储顺序。
ArrayList对数组进行了封装,实现了长度可变的数组,没有限定数据类型。
public static void main(String[] args) {
Dog ououDog=new Dog("欧欧","雪奈瑞");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","雪纳瑞");
Dog feifeiDog=new Dog("菲菲","拉布拉多");
List dog=new ArrayList();
dog.add(ououDog);
dog.add(yayaDog);
dog.add(meimeiDog);
dog.add(feifeiDog);
dog.add(2,feifeiDog);
System.out.println("共计有"+dog.size()+"条狗狗");
System.out.println("分别是");
for (int i = 0; i < dog.size(); i++) {
Dog d = (Dog)dog.get(i);
System.out.println(d.getName()+"\t"+d.getStrain();
}
}
List接口中定义的各种常用方法
方法名称 | 说明 |
---|---|
boolean add(Object o) | 在列表末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o ) | 在指定的索引位置添加元素,原索引位置及其后面的元素依次后移 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素 |
boolean contains (Object o) | 判断列表中是否存在指定元素 |
boolean remova(Object o) | 从列表删除元素 |
Object remove (int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
2.LinkedList集合类
LinkedList采用链表存储方式。
public static void main(String[] args) {
Dog ououDog=new Dog("欧欧","雪奈瑞");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","雪纳瑞");
Dog feifeiDog=new Dog("菲菲","拉布拉多");
LinkedList dogs = new LinkedList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.addLast(yayaDog);
dogs.addFirst(feifeiDog);
Dog dogFirst=(Dog)dogs.getFirst();
System.out.println("第一条狗的昵称是"+dogFirst.getName()+".");
Dog dogList = (Dog)dogs.getLast();
System.out.println("最后一条狗的昵称是"+dogList.getName()+".");
dogs.removeFirst();
dogs.removeLast();
System.out.println("\n删除部分狗狗后还有"+dogs.size()+"条狗狗");
System.out.println("分别是");
for (int i = 0; i < dogs.size(); i++) {
Dog dog = (Dog)dogs.get(i);
System.out.println(dog.getName()+"\t"+dog.getStrain());
}
}
LinkedList的一些特性方法
方法名称 | 说明 |
---|---|
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removaFirst() | 删除并返回列表中第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
3.Map接口
1.HashMap集合类
Mpa接口存储一组成对的键-值对象,提供key到value的映射。Map中key不要求有序,不允许重复,value不要求有序,但允许重复。
4.迭代器Iterator
1.使用Iterator遍历集合类
public static void main(String[] args) {
Dog ououDog=new Dog("欧欧","雪奈瑞");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","雪纳瑞");
Dog feifeiDog=new Dog("菲菲","拉布拉多");
Map a=new HashMap();
a.put(ououDog.getName(),ououDog);
a.put(yayaDog.getName(),yayaDog);
a.put(meimeiDog.getName(),meimeiDog);
a.put(feifeiDog.getName(),feifeiDog);
//通过迭代一次输出集合中的狗
System.out.println("使用Iterator遍历"+"所有的狗的昵称和品种分别是");
Set kyes =a.keySet();//取出key集合
Iterator it =kyes.iterator();
while (it.hasNext()) {
String key=(String)it.next();
Dog dog = (Dog)a.get(key);
System.out.println(key+"\t"+dog.getStrain());
}
}
ArrayList和数组采用了相同的存储方式,他的优点在于遍历元素和随机访问元素的效率比较高。LinkedList优点在于插入,删除元素是效率比较搞。
HashMap是最常见的Map实现类,它的存储方式是哈希表,优点是查询指定的元素效率高。
Iterator为集合而生,专门实现集合的遍历,隐藏了各种集合实现类的内部细节,提供类遍历集合的统一编程接口。
String key=(String)it.next();
Dog dog = (Dog)a.get(key);
System.out.println(key+"\t"+dog.getStrain());
}
}
ArrayList和数组采用了相同的存储方式,他的优点在于遍历元素和随机访问元素的效率比较高。LinkedList优点在于插入,删除元素是效率比较搞。
HashMap是最常见的Map实现类,它的存储方式是哈希表,优点是查询指定的元素效率高。
Iterator为集合而生,专门实现集合的遍历,隐藏了各种集合实现类的内部细节,提供类遍历集合的统一编程接口。
上一篇: 9件人生中无能为力的事。。。
下一篇: 西游日记搞笑漫画 最后一集