可变参数:在参数类型后面使用…就是可变参数,这种方式是JDK1.5后出现的
如果想要在定义函数时,让函数可以接受多个参数(参数个数不明确,只有调用函数时才能明确),而且多个参数类型一致
语法:修饰符 返回值类型 方法名(参数类型… 形参名){}
作用等同于:修饰符
返回值类型 方法名(参数类型[] 形参名){}:存在的问题:调用方法时必须传递数组,而上一种方式只需要传递数据就可以了
总结:虽然可变参数代表的是数组,但是使用…定义的参数,在调用方法时不需要创建数组(这就是简单的地方),直接将数组中的数据作为实参进行传递
注意:如果在方法定义时,拥有多个参数,而且参数中包含可变参数,那么可变参数一定要写在参数列表的最后位置
集合嵌套:集合中又包含集合
举例:
ArrayList<ArrayList> list = new ….;
HashMap<String,ArrayList map = new ….;
HashMap<String,HashMap<String,Student>> map = new ….;
Java中异常体系:
Throwable:是所有错误或异常的超类
Error:错误
Exception:异常,程序在编译时,运行时发生的某种问题
RuntimeException:运行时异常,出现在运行过程中出现的异常,一旦发生就需要开发者修改源代码
NullPointException:空指针
ArrayIndexOutOfBoundsException:下标越界
异常(Exception):Java代码在程序在编译时,运行时发生的某种问题,报错都是以XXXException说明
会出现:
错误(Error):物理上的问题,磁盘,硬盘,内存….物理上问题,是没办法处理的系统级别问题,只能修改代码,报错都是以XXXError说明
会出现:
Java中异常处理:
声明异常:方法本身不处理异常,而是将方法可能出现的异常声明在方法上,让方法调用者处理
语法:
修饰符 返回值类型 方法名(参数列表) throws 异常类名1,异常类名2,….{}
public void show() throws Exception{}
捕获异常:当方法出现异常时,方法本身会直接处理
在可能出现异常的函数中,通过使用try…catch…finally结构处理异常
提示:Java中当出现异常时,程序会停止在异常出现的位置,异常之后的代码就不会执行,必须当异常被处理后才能执行
语法:
try{
//可能出现异常的代码
}catch(异常类名 自定义对象名){
//异常处理代码(异常出现时执行的代码)
}finally{
//不管是否出现异常都会执行的代码,不会因为异常的出现而发生阻塞
//实际开发中都是用于释放资源
}
说明:
Try:该代码块中编写可能出现异常的代码,try代码块必须存在而且一个结构中只能存在一个try
Catch:用于进行异常捕获,当异常发生时,会依次从上往下判断出现的异常类和哪个catch后面的类名匹配,然后才执行catch代码块的代码,catch代码块可以有0个或多个
Finally:用于编写一些特定的代码,用来保证这些代码无论异常是否发生都能执行。异常发生时,程序会发生跳转,这样可能会出现某些代码不能执行到,而finally就能解决该问题。finally代码块可以有0个或1个
Try…catch…Finally组合方式:
Ø try…catch…finally组合:try检测异常,并将异常传递给catch处理(不管try中出现多少个异常类型,都是一种处理方式),在finally中释放资源
Ø 一个try多个catch:try检测异常,然后将异常传递给catch处理,并且对没种异常进行不同处理
try{
//检测异常
}catch(异常类名1 自定义对象名){
//对异常类1出现时的处理方式
} catch(异常类名2 自定义对象名){
//对异常类2出现时的处理方式
}……
提示:这是一种多个异常分别处理的结构,每个catch后面的异常类不能相同,如果多个异常类之间存在父子关系,那么子类必须写在上面的catch位置,父类写在下面的catch(异常类匹配是从上往下的,如果父类在上,那么会出现多个子类没法匹配成功,而是全部匹配父类)
Ø try…finally组合:该结构没有catch效果等同于throws
try{
//检测异常
}finally{
//释放资源操作
}
总结:开发中一般都让try中的代码尽量少,catch尽量细分