Day18
一、学习目标
1.Collection集合
2.异常
3.异常的处理
二、知识点
集合概述
集合是java中提供的一种容器,可以用来储存多个数据。
- 集合和数组的区别
a. 数组的长度是固定的,集合的长度是可变的
b.数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不—致。在开发中般当对象多的时候,使用集合进行存储。 - 集合的框架
JAVASE提供了满足各种需求的APl,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。
集合按照其存储结构可以分为两大类,分别是端列集合java.util.collection和双列集合java.util.Map,今天我们主要学习collection集合。
(注:这两张图是连起来的,因上传不了大图,分为两张图发) - Collection:单列集合类的根接口,用于存储—系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List和java.util.set。其中,List 的特点是元素有序、元素可重复。setl的特点是元素无序,而且不可重复。List接口的主要实现类有java.util.ArrayList和java.util.LinkedList. Set接口的主要现类有avaLutlil.Hashset和java.util.Treeset 。
- Collection常用功能
Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(ListFCSet)通用的一些方法,这些方法可用于操作所有的单列集合。方法如下:
public boolean add(E e):把给定的对象添乔加加口到当前集合中
public void clear( ):清空集合中所有的元素
public boolean remove(E e):把给定的对象在当前集合中删除
public boolean contains(E e):判断当前集合中是否包含给定的对象
public boolean isEmpty( ):利断当前集合是否为空
public int size( ):返回集合中元素的个数
public Object[ ] toArray( ):把集合中的元素,存储到数组中
异常概念
指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。异常指的并不是语法错误语法错了,编译不通过不会产生字节码文件,根本不能运行。
- 异常体系
异常机制其实是帮助我们找到程序中的问题,异常的根类是java.lang.Throwable,其下有两个子类:java.lang.Error与java.1ang. Exception,平常所说的异常指java.lang.Exception。
- Throwable体系
. Error:严重错误Error,无法通过处理的错误,只能事先避免。 - Throwable的常用方法:
·public void printStackTrace():打印异常的详细信息
包含了异常的类型,异常的原因还包括异常出现的位置,在开发和调试阶段都得使用printStackTrace
·public string getMessage( ):获取发生异常的原因
提示给用户的时候就提示错误原因
·public string tostring( ):获取异常的类型和异常描述信息(不用)
出现异常,不要紧张把异常的简单类名烤贝到APIl中去查 - 异常的分类
我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程异常(Exception)的分类:根据在编译时期还是运行时期去检查异常?
·编译时期异常:checked异常,在编译时期就会检查,如果没有处理异常则编译失败。
·运行时期异常:runtime异常,在运行时期检查异常,在编译时期运行异常编译器检测不报错。
异常的处理
Java异常处理的五个关键字:try.catch. finally. throw. throws
9. 抛出异常throw
在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法就应该告诉调用者,传递合法的数据进来,这时需要使用抛出异常的方式来告诉调用者。
抛出异常throw格式:throw new 异常类名 (参数);
三、应用运行
1.Collection集合
使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)注意:
Iterator接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型迭代器就是什么泛型。
代码示例
package demo01;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo02Iterator {
public static void main(String[] args) {
//创造集合对象
Collection<String> coll=new ArrayList<>();
//往集合中加入元素
coll.add("科比");
coll.add("詹姆斯");
coll.add("布拉特");
coll.add("麦迪");
coll.add("艾佛森");
coll.add("姚明");
//多态 接口 实现类对象
Iterator<String> it=coll.iterator();
//获取迭代器的实现类对象,并且会把指针(索引)指向集合的索引
if(it.hasNext()) {
String e=it.next();
System.out.println(e);
}
if(it.hasNext()) {
String e=it.next();
System.out.println(e);
}
/*
发现使用迭代器取出集合中元素的代码,是一个重复的过程
所以我们可以使用循环优化
不知道集合中有多少元素,使用while循环
循环结束的条件,hasNext方法返回false
*/
while(it.hasNext()) {
String e=it.next();
System.out.println(e);
}
/*
判断集合中还有没有下一个元素
做了两件事:
1.取出下一个元素“科比” “麦迪” “詹姆斯” “艾佛森” “姚明”
2.会把指针向后移动一位
*/
for(Iterator<String> it2=coll.iterator(); it2.hasNext();) {
String e=it2.next();
System.out.println(e);
}
System.out.println("----------");
//增强型for循环
for(String s:coll) {
System.out.println(s);
}
System.out.println("----------");
int[] arr1= {4,5,6,7,8,9,10};
for(int i=0;i<arr1.length;i++) {
System.out.println(i);
}
for(int i:arr1) {
System.out.println(i);
}
}
}
运行结果
- 添加功能 boolean add(String s)
代码示例
package demo01;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Collection;
public class Demo01Collection {
public static void main(String[] args) {
Collection<String> coll=new ArrayList<>();//使用多态形式
System .out.println(coll);
boolean b1=coll.add("张三");
System.out.println(b1);
System.out.println(coll);
System.out.println("李四");
System.out.println("麻子");
System.out.println("王二");
System.out.println("小六");
System.out.println(coll);
boolean b2=coll.add("李四");
System.out.println(b2);
System.out.println(coll);
boolean b3=coll.add("王二");
System.out.println(b3);
System.out.println(coll);
boolean b4=coll.add("麻子");
System.out.println(b4);
boolean b5=coll.isEmpty();
System.out.println(b5);
int b6=coll.size();
System.out.println(b6);
Object[] arr=coll.toArray();
//for(int i=0;i<arr.length;i++)
//{
System.out.println(arr[0]);
//}
coll.clear();
System.out.println(coll);
}
}
运行结果
2.异常
- Exception表示异常,异常产生后程序员可以通过代码的方式征,使程序继续运行,是必须要处理的。
代码示例
package demo02;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo01Exception {
public static void main(String[] args) {
//编译期异常
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date=null;
System.out.println("第一句测试");
try {
date=(Date) sdf.parse("2021-05-11");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date);
System.out.println("第二句测试");
//runtiemEx运行期异常
int[] arr= {1,2,3};
System.out.println(arr[0]);
//有问题,但不提示,因为编译器能够通过,在执行时才有异常
try {
System.out.println(arr[2]);
} catch (Exception e) {
System.out.println("第一句测试");
System.out.println(e);
}
//error错误
int[] arr2=new int[1024*1024*1024*1024*1024*1024];
System.out.println("后续代码");
}
}
运行结果
3.异常的处理
抛出异常throw
- 在Java中,提供了一个throw关键字,它用来抛出一个指定的异常对象,抛出一个异常具体怎么操作呢?
创建一个异常对象,封装一些提示信息(信息可以自己手写) - 需要将这个异常处理对象告知给调用者,怎么告知、怎么将这个异常对象传递到调用者处呢?
通过关键字throw就可完成,throw异常对象
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处并结束前方法的执行。
代码示例
package demo02;
public class Demo02Throw {
public static void main(String[] args) {
int[] arr=null;
//int[] arr=new int[3];
int e=getElement(arr,3);
System.out.println(e);
}
public static int getElement(int[] arr,int index) {
//判断 索引是否越界
if(arr==null) {
throw new NullPointerException("传递数组的值是NULL");
}
if(index<0||index>arr.length-1) {
throw new ArrayIndexOutOfBoundsException("传递的索引超出数组的正常使用范围");
}
int ele=arr[index];
return ele;
}
}
运行结果
异常和异常处理结合使用
代码示例
package demo02;
import java.io.IOException;
import javax.management.InstanceNotFoundException;
public class Demo03Throws {
public static void main(String[] args) throws InstanceNotFoundException, IOException {
readFile("c:\\a");
System.out.println("后续代码");
}
//public static void redFile(String fileName) throws FileNotFoundException,IOException {
//public static void main(String[] aegs) throws IOException {
public static void readFile(String fileName) throws InstanceNotFoundException,IOException {
if(!fileName.equals("c:\\a.txt")) {
throw new InstanceNotFoundException("传递的文件不是c:\\a.txt");
}
if(!fileName.endsWith(".txt")) {
throw new IOException("文件后缀名有无");
}
System.out.println("文件名正确");
}
}
运行结果
2020080605051