1.异常是程序运行过程中出现的问题。同时也是Java语言健壮性的一个重要体现
2.什么时候会出现异常呢?——在程序中,由于操作人员或者程序员的误操作导致程序无法正常的执行,如:数组下标越界等这些异常。当然,除了人为原因以外还有由硬件设备的故障导致的。
3. 异常的分类:
i. 检查异常(非运行时异常)——在书写时就必须进行处理的异常,如果不处理,程序就不能编译通过:IOException、SQLException等以及用户自定义的Exception异常
ii. 运行时异常(非检查时异常)——通常是一个在运行时出现的可以被避免的异常类型:NullPointerException、IndexOutOfBoundsException
iii. 错误(不是异常,但同样是由用户或者程序员导致的)——Error
错误和异常都会使程序奔溃
在Java中异常被视为对象,由方法抛出
4.那如果在某一个方法中出现了异常,会怎么样呢?
i. 首先方法会被压入内存中的方法调用栈中
ii. 当方法抛出异常时,该方法从调用栈出被弹出,同时将异常对象抛给前一个方法
5.异常出现时的解决方法
i. 捕获这个异常,不让它沿着调用栈继续向下抛出。
ii. 捕获这个异常,并继续向下抛出。
iii. 不捕获这个异常,从而导致方法从调用栈中被弹出,异常对象最终抛给main方法
6. Java的Error和Exception是throwable的子类,由于所有的异常的父类都是throwable所以我们可以直接调用父类中有的方法:e.printStackTrace();
7. 运行时异常就是不会主动提醒我们捕获的异常:下标越界
8.非运行时异常就是写完某些代码后,如果可能出现该异常,则会提示你自动加上该捕获异常的方法:FileInputStream fileInputStream = new FileInputStream("aaa");
9.捕获异常:try...catch语句
try语句块中加入可能出现异常的代码;
而catch异常中,会尝试对写入的异常种类进行检查,如果出现相应的异常,则执行捕获块,
并使用e引用来指代异常的对象,并进行异常信息的处理P245方法
注意:并非写了try...catch语句就能捕获到
比如像想捕获一个空指针异常,却出现了下标越界异常,则不会进行下标越界异常的捕获
10. 捕获异常与多态性
catch块不能随便的以任意顺序列出——大的异常不能放在前面。
可以用父类异常来捕获子类的异常
11. 异常处理及声明的规则--对检查异常的一个严格的执行规则
该规则规定,一个检查异常,要么被处理,要么被声明,当然处理异常就是之前讲的try...catch捕获,而声明呢:是使用throws关键字,注意,声明的异常不会在该方法中被处理
注意事项:异常处理和声明规则不适用于运行时异常,往往会忽略该异常
12. 不管是什么异常,都可以进行声明
a) 那如何进行声明呢?
iv.
v. 如果是运行时异常也是同样的,如果同时要声明两个异常,则中间使用,隔开
vi. 注意:如果是声明异常,运行时异常声明时不会有提示,而检查异常会有提示:在方法中声明
- FileInputStream fileInputStream = new FileInputStream("aaa");并声明异常,在main方法中调用时则会提醒,当然如果加了其它的声明,则一并捕获或者继续声明
vii. 什么时候想处理,什么时候想声明完全由设计决定
13. 在异常声明时,一般都会抛出一个异常给上层方法处理,或者在捕获异常时,我们都可以使用父类异常。
14. 使用throw关键字抛出一个异常
抛出的异常可以是一个新的异常实例,也可以是一个我们刚刚捕获的异常,当然,throw语句会导致当前代码立即停止执行,而且将异常抛给上一个方法
15. throw/throws的区别
b) throws出现在方法函数头;而throw出现在函数体。
c) throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
d) 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
16. 好的编程习惯
e) 在写程序时,对可能会出现异常的部分通常要用try...catch...去捕捉它并对它进行处理;
f) 用try...catch...捕捉了异常之后一定要对在catch...中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();
g) 如果是捕捉IO输入输出流中的异常,一定要在try...catch...后加finally...把输入输出流关闭;
h) 如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。
17. finally关键字用于try...catch语句最后
注意,不管是否执行捕获块,都会执行finally执行块
18. 书写一个自定义异常
i) 书写自定义异常有几点重要知识点——P264
j) 如何书写一个自定义异常呢?
使用时一般加上判断和throw和throws一起使用
19. System类:System类代表当前Java程序的运行平台
CurrentTimeMillis():返回以毫秒为单位的当前时间
Exit(int status):终止当前正在运行的Java虚拟机
GetProperties():确定当前的系统属性
GetProperty(String key):获得指定键指示的系统属性
NanoTime():返回最准确的可用系统计时器的当前值,以毫微秒为单位
Gc():运行垃圾回收器
20.Runtime类:Runtime类代表Java程序的运行环境
21.String相关类:String类包含了一个不可变的字符串
Char charAt(int index):返回指定索引的字符
Int compareTo(Object o):将该字符串对象与另一个对象进行比较
String concat(String str):将指定字符串连接到该字符串末尾
Boolean equals(Object anObject):将该字符串与指定对象进行比较
Int indexOf(int ch):返回指定字符在该字符串内首次出现的索引
Int length():返回该字符串的长度
String substring(int beginindex):返回新字符串,作为该字符串的子字符串
String toUpperCase():使用由LocalegetDefault返回的默认输入语言规则将该字符串中的所有字符转换为大写
Static String valueOf(int i):返回整型参数的字符串表示法
Static String valueOf(Object obj):返回对象参数的字符串表示法
22. StringBuffer/StringBuilder对象代表一个可变的字符串
StringBuffer代表线程安全的,StringBuilder代表线程不安全的
23.日期相关类:
Date类:表示特定的瞬间,精确到毫秒
DateFormat抽象类:提供了很多种格式化日期时间
SimpleDateFormat类:可以自定义时间输出格式
Calendar抽象类:提供了很多方法来完成日期时间之间的相互操作功能
GregorianCalendar类:用来代表世界上大多数国家和地区采用的公历日历
24.Math类:数学工具类
25.随机数:
通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字
通过Math类的静态方法random()返回一个0到1之间的double值
通过Random类来产生一个随机数
26. 包装类:将基本数据类型封装成类
所有的包装类都是final类型,不能创建他们的子类
包装类是不可变类。一旦创建了一个包装类的对象,那么他包含的基本类型数据就不能改变
27. 正则表达式:根据一组字符串中每个字符串所共有的特征,使用特定的符号来描述该组字符串的一种方法。正则表达式就是一种规范。
28. Pattern类
Pattern.matches("a*b", "aaaaab");第一个是正则表达式,第二个是要进行匹配的值
pattern.pattern();打印出该正则表达式
Pattern p1 = Pattern.compile("a*b");String[] arr1 = p1.split("rrrrraacbccccaaaaab");以此正则表达式进行拆分
29. Matcher类 matches方法: 方法尝试将整个输入序列与该模式匹配
30.lookingAt方法,从开头第一个字符进行匹配,匹配成功了不再继续匹配.从第一个字符开始,匹配失败了,也不继续匹配.不需要匹配整个序列
31. find方法,从开头第一个字符进行匹配,找出所有匹配的字符串
32. 带参数的group方法与不带参数的group方法区别
不带参数的group方法:find方法与lookingAt方法匹配出来的子序列
带参数的group方法:返回在以前匹配操作期间由给定组捕获的输入子序列。