欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第五章:异常

程序员文章站 2022-04-03 07:56:46
...

第五章:异常

异常就是在程序运行过程中所发生不正常的事件,如所需文件找不到,网络连接不通或中断,算术运算符出错(如被零除),数组下标越界,装载了一个不存在的类,对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的集合类主要由两个接口派生而出:CollectionMap,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为集合而生,专门实现集合的遍历,隐藏了各种集合实现类的内部细节,提供类遍历集合的统一编程接口。