目录
TreeMap :底层是基于红黑树的Map接口的实现类
HashMap和Hashtable的区别
1、相同点:它们存储的元素类型都是K-V格式的
2、不同点:
1、Hashtable是线程安全的HashMap不是线程安全的
2、Hashtable的Key的值和value的值都不允许为null,而HashMap
异常:Java程序出现的错误,程序出现了不正常的情况
Java中的异常:Throwable
严重的问题:Error,一般情况下,我们不处理,这样的问题一般都是很严重的,比如OOM,内存溢出问题
问题:异常:Excption
运行时异常:RuntimeException,这样的问题我们不处理,因为这种问题一般都是你自己写代码出现的问题,比如代码不够严谨
编译时异常:除了不是RuntimeException都是编译时异常,必须要进行处理,如果你不处理,程序编译就不通过,无法运行。
如果程序出现了问题,我们没有做任何处理,最终JVM会给出一个默认的处理
把异常的名称,相关的原因,以及出现的问题的相关信息,包括位置输出在控制台,同时程序会结束,后面的代码不会运行
异常处理的格式
1、try...catch...finally
2、throws
try...catch...finally的处理格式:
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的一些处理;
}finally{
释放资源的代码;
}
finally:在try...catch处理异常的时候,末尾通常会加一个finally,被它控制的语句体,一定会执行,一般情况下,里面放的是释放资源的代码
将来try...catch...finally用的最多的地方是连接数据库,finally,放的是释放连接资源的东西,IO的操作这里用的也是比较多的
final,finally,finalize的区别
final:最终的意思,可以修饰类,成员变量,成员方法
修饰类:类不能被继承
修饰成员变量:变量就是常量
修饰成员方法:方法不能被重写
finally:是处理异常的一部分,一般情况下用于释放资源的作用,一般来说都会执行,特殊情况下:在执行finally之前JVM就停了(System.exit(0))
finalize:是Object类中的一个方法,用于手动回收垃圾,但是不一定立即回收
JAVA中有一个类来供我们使用,抽象的表示硬盘上的各种文件,这个类叫做File
File:文件和目录(文件夹)路径名的抽象表现形式
File类的构造方法:
public File(String pathname)
public File(String parent,String child) 根据一个目录和一个子文件(目录)得到一个File对象
public File(File parent,String child) 根据一个父的File对象和一个子文件(目录)得到一个File对象
创建功能:
public boolean createNewFile() 创建一个新的文件,如果已经存在就不创建,不会报错,目录不存在报错
public boolean mkdir() 创建一个文件夹,已经存在不创建,返回false
public boolean mkdirs() 创建一个多级文件夹
public boolean delete() 删除文件夹前,要保证文件夹空
变形格式:
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的一些处理;
}
注意事项:
1、try里面的代码尽量不要太多
2、catch里面必须要有内容,哪怕只是有一句简单提示语句
1、处理一个异常的情况
2、处理多个异常的情况
1、每个异常都写一个try...catch
2、写一个try,多个catch
try{
可能会出现问题的代码;
}catch(异常的类名 变量名){
针对问题的处理;
}catch(异常的类名 变量名){
针对问题的处理;
}...
注意事项:
1、能明确异常的类型的时候尽量明确,不要用父类大的作处理
2、平级的关系,多个catch异常没有前后顺序关系,谁在前谁在后无所谓,一旦出现了父类继承的关系,父必须在后
3、一旦try里面的代码出现了问题,就会去匹配catch里面的异常,继续执行程序后面的代码,但是try里面的代码就停在了出现问题的那一步。
JDK的新特性及注意事项
新特性处理多个异常
try{
可能会出现问题的代码;
}catch(异常类名1|异常类名|... 变量名){
处理异常的提示;
}
注意:
1、处理方式是一致的,这个方法虽然比较简洁,但是不够好,针对多种类型的问题,只给出了一种解决方案。
2、多个异常的类型之间必须是平级关系
编译时期异常与运行时期异常的区别
1、编译时期异常:JAVA程序必须显示处理,否则程序就会发生错误,无法通过编译
2、运行时期异常:无需显示处理,也可以和编译时异常一样处理
异常中需要掌握的方法:
getMessage()
获取异常信息,返回字符串
toString()
获取异常类名和异常信息,返回字符串。
返回此可抛出的简短描述。结果是:
这个对象的类name+“:”(一个冒号和一个空格)+调用这个对象的getLocalizedMessage()方法的结果
对于不重写此方法的子类,默认现实返回相同的结果为getMessage()
printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void
我们不做处理的时候,一旦发生异常,后面的代码就不会运行,我们做了异常处理,后面的代码正常运行
我们没有权限去处理的异常,或者处理不了的异常,干脆不处理
JAVA针对这种情况,提供了throws抛出
格式:
throws异常类名
注意:这个格式必须跟在方法的小括号后面,大括号前面
注意:
1、编译时期异常抛出,方法内可以不做处理,但是将来调用者调用该方法的时候必须处理
2、运行时期异常抛出,将来调用者可以不做任何处理,但是一旦调用出错,后面的代码程序不会执行
3、最好抛出的是详细的异常类型,也是推荐的做法,可以抛出大的异常类型,但是处理的时候要对应上。
4、尽量不要在main方法上抛出,如果在main方法上抛出,程序会停止,后面的代码不会执行
throw:
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
throw和throws的区别:
throws:用在方法声明的后面,跟的是异常的类名。
可以跟多个异常类名,用逗号隔开
表示的是抛出异常,由该方法的调用者处理
throws表示的是出现异常的一种可能性,为了程序的正常运行,我们选择抛出给调用者处理,不一定会发生这种异常
throw:用在方法内,跟着的是异常的对象。
只能抛出一个异常对象。
表示的时候抛出异常,由方法体内的语句做处理。
throw表示的是一定出现了某种异常