第五章:异常

第五章:异常

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值