参考博客:
Java中的异常和处理详解_weixin_34414196的博客-CSDN博客
目录
5、StringBuffer类和StringBuilder类
一.异常类
1.概念:
异常是程序运行中出现的一些错误,Java提供了优秀的解决办法:异常处理机制
异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。
Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手动抛出的,只要在Java程序中产生了异常,就会用一个对应类型的异常对象来封装异常,JRE就会试图寻找异常处理程序来处理异常。
2.分类:
Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。Throwable又派生出Error类和Exception类。
Throwable类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常。
Error:(及其子类的实例)代表了JVM本身的错误(不可预料),错误不能被程序员通过代码处理。(很少出现)
Exception:(较常见)(可预料)
针对javac分类检查与非检查
1)非检查异常(unckecked exception):
Error 和 RuntimeException 以及他们的子类。对于这些异常,我们应该修正代码,而不是去 通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。
如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。
2)检查异常(checked exception):
除了Error 和 RuntimeException的其它异常。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。
如SQLException , IOException,ClassNotFoundException 等。
3.异常处理的基本语法
一、捕获:try-catch(在方法体内)
try {
//可能发生异常的代码
} catch (Exception e) {
//针对异常出现后,要进行的操作
}finally {
//一定会执行的代码,一般是关闭流、数据库连接等
}
注意事项:
1、子类异常在上面,父类异常在下面,平级异常顺序无所谓
2、不要用Exception处理全部,尽量细化异常处理方式,因为不同的异常可能要进行不同的处理
二、抛出:throws(在方法上)
向外再抛出给调用者(谁调用谁处理),为了给调用者(其他程序员)一个提示
语法:通过throws关键字,用在方法()后{}前,多个异常逗号隔开,顺序无所谓。
public void foo() throws ExceptionType1 , ExceptionType2 ,ExceptionTypeN
{
//foo内部可以抛出 ExceptionType1 , ExceptionType2 ,ExceptionTypeN 类的异常,或者他们的子类的异常对象。
}
throws仅仅是将函数中可能出现的异常向调用者声明,而自己则不具体处理。
4.自定义异常
按照国际惯例,自定义的异常应该总是包含如下的构造函数:
- 一个无参构造函数
- 一个带有String参数的构造函数,并传递给父类的构造函数。
- 一个带有String参数和Throwable参数,并都传递给父类构造函数
- 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。
二.常用类
1、内部类
顾名思义,内部类是定义在一个类里面的类。
成员内部类、静态内部类、局部内部类、匿名内部类
2、Object类
Object类是超类,是所有类直接或间接的父类,可以存储任何对象。
3、包装类
基本数据类型所对应的引用数据类型,可实现自动装箱和自动拆箱。
4、String类
字符串是常量,创建之后不可改变;字符串字面值存储在字符串池中,可以共享。
5、StringBuffer类和StringBuilder类
StringBuffer(使用缓冲区)
可变长字符串,JDK1.0提供,线程安全,运行效率较低。
StringBuilder(使用缓冲区)
可变长字符串,JDK5.0提供,运行效率高,线程不安全。
与String区别:
(1)比String效率高;
(2)比String节省内存
6、BigDecimal类
精确计算浮点数
7、Date类
Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代。
8、Calendar类
Calendar提供了获取或设置各种日历字段的方法。
构造方法:protected Calendar();由于修饰符是protected,所以无法直接创建对象。
9、SimpleDateFormat类
SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。
进行格式化(日期 -> 文本)、解析(文本 -> 日期)。
10、System类
系统类,主要用于获取系统的属性数据和其他操作,构造方法私有。
三、容器
1、定义
java容器是前人为我们提供的一套用于存储数据和对象的工具。java容器又可以称为Java Collection Framework(JCF)。里面除了存储对象的容器之外,还提供了一套用于处理和操作容器里面的对象的一套工具类。
2、分类
List:
列表,是一个接口。它的实现类常用的有LinkedList、ArrayList和Vector。
1)LinkedList:
采用双向链表实现的列表,因此可以被用作队列、堆栈、双端队列;顺序访问高效,随机访问性能较差、适用于需要经常添加和删除的数据。
LinkedList不支持同步。
2)ArrayList:
是采用数组实现的列表,因此它支持随机访问,不适合频繁删除和插入
操作。对于需要经常进行查询的数据建议采用此结构。ArrayList与java数组的一个大的区别是ArrayList能够自动扩容
ArrayList不支持同步。
3)Vector:
Vector用法和ArrayList用法很相似,它们的区别在于Vector是线程同步的而且Vector有另外的遍历方式。
Set:
集合,和数学中的集合类似。
特点:
- 确定性:对任一对象都能判定它是否属于某一个集和
- 互异性:一个集和中不会存在两个相同(内容相同)的对象
- 无序性:集和里面的元素没有顺序
1)HashSet
基于散列函数的集和,采用HashMap实现,可以容纳null元素,不支持同步(可以通过Collections.synchronizedSet(new HashSet<…>()来使它同步)
2)HashLinkedSet
继承HashSet ,基于散列函数和双向链表的集和,可以容纳null元素,通过双向链表维护了插入顺序,从而支持排序,但不支持同步(可以通过Collections.synchronizedSet(new HashSet<…>()来使它同步)
3)TreeSet
基于树结构的集和,印次支持排序,不能容纳null元素,同样不支持同步
Map:
Map是一类重要的数据结构。类似于数学中的函数,key对应自变量x、value对应因变量y、散列函数对用f。
1)Hashtable
key和value都不能为空,HashTable是线程安全的、同步的,但只适合用于小数据量
2)HashMap
HashMap允许有null,不支持同步(支持通过Collections.synchronizedMap(new Map<…,…>() 实现同步),所以线程不安全。但可以存储大量数据
3)LinkedHashMap
基于双向链表用于维持插入顺序的HashMap,继承自HashMap
4)TreeMap
基于红黑树的Map,可以根据key的自然排序或者compareTo方法排序输出
5)Properties
继承自Hashtable。特有的方法有load()、store()等等。
工具类
1)Arrays
Arrays处理的对象是数组,常用的方法包括排序sort、查找binarySearch、拷贝copy等等。
2)Collections
Collections可以操作collections接口及其所有子类、常用的用法和Arrays差不多。但它的sort方法要求被排序对象实现了compareable接口或者传入一个compactor对象(主要针对某些类不能去被修改)。