异常与集合框架
异常
定义:在程序运行过程中出现的错误
异常分类
编辑错误/语法错误:指不能够运行,在编译阶段就报错
运行错误:能够正常编译,但是运行时报错
逻辑错误:与预期的不一样,能够正常编译,也能够正常运行
Throwtable | ||
---|---|---|
Error(错误) | Exception(异常) | |
AWTEeeor | InputMismatchException:输入类型不匹配异 | |
ThreadDeatlth | NullPointException | |
ArrayIndexOutOfBoundsException | ||
StringIndexOutOfBoundsException | ||
FileNotFoundException文件找到异常 | ||
NumberFormatExcetpion:转换异常 |
3.处理手段
<1>try…catch…finally的形式:
try | 监控代码,监控可能发生错误的代码 |
---|---|
1.如果代码里面没有发生异常,则整个try执行完毕,不进入catch | |
2.如果try里面有异常,则try里面后面的代码不会执行,会进入相对应的catch里面 | |
捕获catch里面指定类的异常 | |
1.语法:catch (类名 对象名),类名 catch(Exception e) | |
2. catch可以一次性出现多个(要求:子类必须出现在父类的前面,catch 后面的类型不能出现相同的) (结果:只会执行一个,第一次匹配的执行) | |
finally | 不管有没有异常 ,finally 一定会被执行 |
除非:1.如果遇到了 System.eixt(1);不会执行finally 2. finally里面的代码也出现异常了 3.程序死亡 4.cpu终止 | |
注意: | try 必须和catch 或者 finally 成双出现 |
<2> throws…throw
throw | throw | |
---|---|---|
说明 | 抛出异常 | 声明异常 |
位置 | 方法里面 | 方法名,小括号里面 |
语法 | throw异常对象名 | throws类名 |
方法 | 如果抛出异常,一定要处理 | 请求外援 |
使用try或者throws | 如果没有处理,则编译报错 |
重写:
父类抛出异常 >= 子类抛出异常
父类返回值 >= 子类
父类访问修饰 <= 子类
示例:
public class TestLog1 {
private static Logger logger =Logger.getLogger(TestLog1.class);
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 (InputMismatchException e) {
logger.debug("两个数字必须是整数!",e);
}catch(ArithmeticException e) {
logger.debug("除数不能为0!",e);
}catch(Exception e) {
logger.debug(e.getMessage());
e.printStackTrace();
System.exit(1);
}finally {
System.out.println("感谢使用本次程序");
}
}
日志
1.使用log4j,一般导人Jar包
2.定义配置文件,:log4j.properties(固定文件名+固定位置)
3.使用Logger
4.配置文件
设置输出的级别,目的地,目的地可以有多个,目的地名字
目的地分两种:
<1>控制台 ConsoleAppender
#区分控制台的颜色 log4j.appender.目的地名称.Target=System.err/System.out
# 日志的布局 log4j.appender.目的地名称.layout=org.apache.log4j.SimpleLayout
<2>log文件
log4j.appender.目的地名称.File=文件名
格式:
SimpleLayout ---简单格式
HTMLLayout ---html格式
PatternLayout ---自定义
5.日志记录
d
e
b
u
g
−
−
−
调
试
i
n
f
o
−
−
−
信
息
w
a
r
n
−
−
−
警
告
e
r
r
o
r
−
−
错
误
f
a
t
a
l
−
−
严
重
警
告
debug---调试 info---信息 warn---警告 error--错误 fatal--严重警告
debug−−−调试info−−−信息warn−−−警告error−−错误fatal−−严重警告
示例:
###\u8BBE\u7F6E\u8F93\u51FA\u57FA\u672C###
log4j.rootLogge=info,stdout.logfile
###\u8F93\u5165\u81F3\u63A7\u5236\u53F0###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.AimpleLayout
###\u8F93\u51FA\u5230\u6587\u4EF6\u4E2D###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}
%l %F %p %m%n
集合框架
定义:
集合框架是为表示和操作集合而规定的一种统一的标准体系结构,集合框架都包含三大块内容对外的接口,接口的实现和对集合运算的算法.
接口:表示集合的抽象数据类型,如Collection,List,set,map,Iterator
List
定义:
List接口继承Collection接口,存储一组不唯一(允许重复)有序(以元素插入的次序来放置元素,不会重写排列)的对象
常用方法 | 说明 |
---|---|
boolean add(Object o) | 在类表末尾顺序添加元素,其实索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素,原索引位置及其后面的元素一次后移 注意:新添加元素的索引位置必须介于0和列表中的元素个数 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素 |
boolean contains(Object o ) | 判断列表中是否存在指定元素 |
boolean remove(Object o ) | 从列表中删除元素 |
Object remove(int index ) | 从列表中删除指定位置元素,起始索引位置从0开始 |
<1>ArrayList:
-
添加数据: add()方法
-
取下标 :get(index i)
-
区别C#
-
C# Java 获取长度 count()方法 Size()方法 删除指定项 删除指定下标:RemoveAt
删除指定值:Remove删除值跟删除下标:都是用remove方法,通过参数类型区分
示例:
public static void main(String[] args) {
// 1.创建4个狗狗对象
Dog ououDog=new Dog("欧欧","雪纳瑞");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","雪纳瑞");
Dog feifeiDog=new Dog("菲菲","拉布拉多");
//2.创建ArrayList集合对象并把4个狗狗对象放入其中
List dogs=new ArrayList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2,feifeiDog);//添加feifeiDog导指定位置
//3.输出集合中狗狗的数量
System.out.println("共计有:"+dogs.size()+"条狗狗.");
//4.遍历集合显示各条狗狗的信息
System.out.println("分别是:");
for (int i = 0; i < dogs.size(); i++) {
Dog dog=(Dog) dogs.get(i);
System.out.println(dog.getName()+"\t"+dog.getType());
}
}
<2>LinkedList:
1.特点:LinkedList采用了链接式存储规则
2.适用于集合数据的频繁修改,不适用于频繁的读写遍历集合
3.使用:
LinkedList list = new LinkedList();
LinkedList<String> listString = new LinkedList<String>;
4.添加:
在List的基础上增加了
addFirst() -->添加到首位
addLast() -->添加到末位
5.取下标
在List的基础上增加了
getFirst()-->取第一个值
getLast()-->取最后一个值
6.遍历
//for循环
for(int i = 0 ; i < list.size();i++) {
//代码块
}list.get(i)
//foreach循环
for(int num : list){
syso(num)
}
//Iterator遍历
Iterator it = list.iterator();
while(it.hasNext()){
syso(it.next());
}
<3>Vector:
类似于ArrayList,唯一的区别就是:
Vector是线程安全的,ArrayList是线程不安全的
Set
定义:接口继承Collection,存储一组唯一(不允许重复),无序的对象
<1>HashSet
1.特点:存储方式类似于数组,插入数据没有任何顺序
2.取值:add()方法
3.获得长度:Size()方法
4.示例
//Set<Integer> hashSet = new HashSet<Integer>();
//不能通过下标取值,因为是无序
HashSet<Integer> hashSet = new HashSet<Integer>();
hashSet.clear(); //清空
hashSet.isEmpty(); //判断是否为空
hashSet.iterator(); //转换为Iterator
hashSet.size(); //得到长度
hashSet.toArray();//转换为数组
hashSet.add(10);
hashSet.add(10); //写了一个判断,如果值已经存在了,是不会添加
hashSet.add(2);
hashSet.add(1);
hashSet.add(100);
<2>TreeSet
1.特点:有序,默认升序,实现SortedSet接口
2.取值:add()方法
3.获得长度:Size()方法
4.示例
System.out.println("Set:");
Set<Integer> set = new TreeSet<Integer>();
//LSP原则:当父类引用指向子类的时候,不能调用子类独有的方法
set.add(1);
set.add(120);
set.add(20);
set.add(20);
set.add(12);
set.add(2);
set.add(0);
Iterator<Integer> it1 = set.iterator();
while(it1.hasNext()) {
System.out.println(it1.next());
}
System.out.println("TreeSet:");
TreeSet<Integer> tset = new TreeSet<Integer>();
tset.add(1);
tset.add(120);
tset.add(20);
tset.add(20);
tset.add(12);
tset.add(2);
tset.add(0);
Iterator<Integer> it = tset.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//tree:树
迭代器Iterator
所有集合接口何磊都没有提供相应的遍历方法,而是把遍历交给迭代器Iterator完成。Iterator为集合而生,专门实现集合的遍历,他隐藏可各种集合实现类的内部细节,提供了遍历集合的同意编程接口。
实现步骤:
1.Collection 接口的Iterator()方法返回一个Iterator,然后通过Iterator接口的两个方法即可方便的实现遍历。
2.Boolean hasNext();判断是否存在另一个可访问的元素
3.Object next();返回要访问的下一个元素
Map
定义:
接口存储一组成对的键-值对象,提供key到Value的映射,Map中的Key不要求有序,不允许重复。value同样不要求有序。但允许重复
常用方法 | 说明 |
---|---|
Object get(Object key) | 根据键返回相关联的值,若不存在指定的键,则返回null |
Object remove(Object key) | 删除指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet() | 返回建的集合 |
Collection values() | 返回值的集合< |
boolean containsKey(Object key) | 若存在指定的键映射的“键-值对”则返回true |
boolean isEmpty() | 若不存在键-值对映射关系,则返回true |
<1>HasMap
1.特点:线程不安全
2.添加.put()方法
3.获取长度.Size()方法
4.示例
Map map = new HashMap();
Map<String, String> map1 = new HashMap<String, String>();
HashMap<String, String> map2 = new HashMap<String, String>();
//存
map2.put("key", "value");
//map2.put("key", "value1");
//取
System.out.println("取值:" + map2.get("key"));
//得到长度
System.out.println("长度:" + map2.size());
//遍历
//怎么拿到所有的key
Set<String> setkey = map2.keySet();
//怎么拿到所有的value
Collection<String> valuesList = map2.values();
//Set和List的父类--》Collection
//List有get方法--》get是List新增的方法,并不是重写父类的方法
//Set没有get方法
//List<String> valuesList = map2.values();
Collection<String> valueSet = map2.values();
<2>.Hastable
1.特点:线程安全
2.添加.put()方法
3.获取长度.Size()方法
4.示例
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(1, "b"); //能有重复的key,直接覆盖之前的
map.put(null, "b"); //java中,key可以是null
for (String valu : map.values()) {
System.out.println(valu);
}
for(Integer key : map.keySet()) {
System.out.println("key : " + key + ", value: " + map.get(key));
}
/*
for(int key : map.keySet()) {
System.out.println("key : " + key + ", value: " + map.get(key));
}*/
<3>ConcurrentMap
1.特点:线程安全,线程安全的性能上比Hashtable 更好
2.基本方法与Hashtable里面的方法一致
3.示例
private static void methodConcurrentHashMap() {
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
map.put("1" , "a");
map.put("1" , "a");
map.get("1");
}
<4>TreeMaP
1.特点:线程不安全,对key进行排序,不能以null作为key
2.基本方法与Hashtable里面的方法一致
3.示例
TreeMap<String, String> treeMap= new TreeMap<String, String>();
treeMap.put("1", "a");
treeMap.put("1", "b");//添加重复键,覆盖以前key对应的value
treeMap.put("3", "b");
treeMap.put("0", "c");
treeMap.put("9", "d");
treeMap.put("7", "e");
treeMap.put(null, "c"); //不能以null作为key
for (String key : treeMap.keySet()) {
System.out.println("key:" + key + ", value:" + treeMap.get(key));
}