Java学习第二周
1.集合
集合是一个容器,和数组一样。
数组特点:大小固定,只能存储相同数据类型的数据
集合特点:大小可动态扩展,可以存储各种类型的数据
Collection包含
List 和Set
List是有序的可重复的
Set是无序的不可重复的
Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。 Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。
2.迭代器
迭代器为我们提供了统一的遍历容器的方式
Interator
迭代的过程中不能对元素进行增删改查
List list=new ArrayList<>();
list.add(“1”);
list.add(“2”);
list.add(“3”);
Iterator it=list.iterator();
int num=1;
while(it.hasNext()) //检查是否有下一个元素
{
String number=it.next();//返回元素值
if(number==“2”)
{
//迭代的过程中不能对元素进行增删改查
list.add(“5”); //错误
}
}
3.异常
异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
与Error不同,error是不可修改的,Exception是可以通过代码修正的
异常的运行会导致程序终止。
过程为1.在方法里因为JVM检查异常产生异常,返回给main函数
2.main函数再返回给JVM虚拟机,虚拟机终止程序,并在控制台上打出异常信息。
异常(Exception)的分类
1.编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败
2.运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)
异常的处理
可以再异常的方法里使用throw禅师一个异常对象,返回给调用函数,同时结束当前方法的执行。
throw new 异常类名(参数);
最后由虚拟机进行终止程序,打印异常信息
声明异常throws
关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常),
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
当不想使用虚拟机进行处理的时候,我们可以捕获异常,这样就不会终止程序。
try…catch
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
try和catch都不能单独使用,必须连用。
Throwable类中定义了一些查看方法:
public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
public String toString():获取异常的类型和异常描述信息(不用)。
public void printStackTrace():打印异常的跟踪栈信息并输出到控制台。
一般我们是使用一次捕获多次处理方式,格式如下:
try{
编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
如果不同异常间有子类父类的关系,子类异常要求在上面的catch处理,父类异常在下面的catch处理。
运行时异常被抛出可以不处理。即不捕获也不声明抛出。
如果finally有return语句,永远返回finally中的结果,避免该情况。
如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
4.代码
//创建集合
Collection coll = new ArrayList();
//多态,父类引用子类对象
//方法重载(方法参数的改变),方法重写(子类继承父类,可以改写方法)
coll.add(“KOBE”);
coll.add(“james”);
coll.add(“Davis”);
System.out.println(coll.contains(“KOBE”));
//迭代器
Iterator it=coll.iterator();
while(it.hasNext())
{
String name=it.next();
System.out.println(name);
}
//强制for循环
for (String s : coll) {
System.out.println(s);
}
Set函数
public static void main(String[] args) {
//不允许重复
//hashCode()和equals()
HashSet set=new HashSet<>();
set.add(“kon”);
set.add(“fa”);
set.add(“sad”);
set.add(“fa”);
System.out.println(“fa”.hashCode());
for (String s : set) {
System.out.println(s);
}
}
Map<Integer, String> s = new HashMap<Integer, String>();
Map<Integer, String> m = new HashMap<Integer, String>();
s.put(1, “one”);
s.put(2, “two”);
s.put(3, “three”);
m.put(1, “一”);
m.put(2, “二”);
System.out.println(s.size()); //测量长度大小
System.out.println(s.containsKey(1)); //检查是否包含1键
System.out.println(m.containsValue(“two”)); //检查是否包含two值
s.put(3, “third”); //键重复了,则会替换旧的键值对
Map<Integer, String> m2 = new HashMap<Integer, String>();
m2.putAll(s);
m2.putAll(m);
System.out.println(“s” + s);
System.out.println(“m:” + m);
System.out.println(“m2:” + m2);
异常
public static void main(String[] args) {
int[] arr = {2, 4, 6};
int index = 3;
//捕获异常,程序运行到最后
try {
int element = getElement(arr, index);
System.out.println(element);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e);
}
System.out.println(“over”);
}
private static int getElement(int[] arr, int index) {
if (index >= arr.length) {
throw new ArrayIndexOutOfBoundsException(“数组索引越界啦!!!!”);//抛出异常
}
int element = arr[index];
return element;
}
public static String []names={“tony”,“Ned”,“Robb”,“John”};
public static void main(String[] args) {
try{
checkUserNanme(“tony”);
System.out.println(“注册成功”);
}catch(Exception e)
{
e.printStackTrace();.//打印异常信息
}
System.out.println("账号已存在");
}
//声明异常
private static void checkUserNanme(String s) throws RegisterException{
//迭代循环
for (String name :names ) {
if(s.equals(name))
{
throw new RegisterException(“该用户已存在”);
}
}
}
总结
今天我学到了很多,尤其是异常的处理方式和概念有了一个大概的了解。不过仍然需要很多的练习,我需要不断练习,才能真正将其熟记于心。