异常与异常处理
1、Java异常机制用到的几个关键字:try、catch、finally、throw、throws
try -- 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch -- 用于捕获异常。catch用来捕获try语句块中发生的异常。
finally -- finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有 finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw 等终止方法的语句,则就不会跳回执行,直接停止。
throw -- 用于抛出异常。
throws -- 用在方法签名中,用于声明该方法可能抛出的异常。主方法上也可以使用throws抛出。如果在主方法上使用了throws 抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导 致程序中断执行。
2、三种类型的异常
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时, 一个异常就发生了,这些异常在编译时不能被简单地忽略
运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们 在编译也检查不到的
3、异常的根接口Throwable,其下有2个子接口,Error和Exception。
Error:指的是JVM错误,这时的程序并没有执行,无法处理;
Exception:指的是程序运行中产生的异常,用户可以使用处理格式处理。
4、异常的处理方案
try...catch、try...catch...finally、try...finally
try{
可能会发生的异常
}catch(异常类型 异常名(变量)){
针对异常进行处理的代码
}catch(异常类型 异常名(变量)){
针对异常进行处理的代码
}...
[finally{
释放资源代码;
}]
注意:
catch 不能独立于 try 存在。
catch里面不能没有内容
在 try/catch 后面添加 finally 块并非强制性要求的。
try 代码后不能既没 catch 块也没 finally 块。
try里面越少越好。
try, catch, finally 块之间不能添加任何代码。
finally里面的代码最终一定会执行(除了JVM退出)
如果程序可能存在多个异常,需要多个catch进行捕获。
异常如果是同级关系,catch谁前谁后没有关系
如果异常之间存在上下级关系,上级需要放在后面
5、自定义异常
在 Java 中你可以自定义异常。如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。
按照国际惯例,自定义的异常应该总是包含如下的构造函数
- 一个无参构造函数
- 一个带有String参数的构造函数,并传递给父类的构造函数。
- 一个带有String参数和Throwable参数,并都传递给父类构造函数
- 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。
下面是IOException类的完整源代码,可以借鉴。
finally块和return
(1)、首先一个不容易理解的事实:在 try块中即便有return,break,continue等改变执行流的语句,finally也会执行。
(2)、finally中的return 会覆盖 try 或者catch中的返回值。
(3)、finally中的return或异常会抑制(消灭)前面try或者catch块中的异常。
Java中的字符串
1、String
(1)、String对象创建后则不能修改,是不可变的,所谓的修改是创建了新的对象,所指向内存空间不同。
(2)、一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用StringBuffer或 者StringBuilder
(3)、每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时也为 ”false” ,如果只需比较内 容是否相同,应使用 ”equals()” 方法,对象实体比较,通过重写Object中的equals方法来比较。
(4)、String常用的类
字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1;使用 indexOf 进行字符或字符串查找时,如果匹配返回位置 索引;如果没有匹配结果,返回 -1
(5)、“==” 和 equals() 有什么区别:
”==“是判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象。
”equals“比较存储在两个字符串对象中的内容是否一致。
字节是计算机存储信息的基本单位,1 个字节等于 8 位, gbk 编码中 1 个汉字字符存储需要 2 个字节,1 个英文字符存储 需要 1个字节。
2、StringBuilder 或 StringBuffe
当频繁操作字符串,不停的创建对象就会额外产生很多的临时变量,使用StringBuilder 或 StringBuffe就会避免这个问题。至于 StringBuilder 和StringBuffer ,它们基本相似,不同之处,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功 能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。
Java中必须了解的常用类
1、包装类
基本数据类型是不具备对象的特性的,比如基本类型不能调用方法、功能简单。。。,为了让基本数据类型也具备对象的特 性,Java为每个基本数据类型都提供了一个包装类,这样我们就可以像操作对象那样来操作基本数据类型。
包装类主要提供两大类的方法:
(1)、将本类型和其他基本类型进行转换的方法
(2)、将字符串和基本类型及包装类互相转换的方法
2、日期类:Date(java.util) 和 SimpleDateFormat(java.text)
(1)、使用 format() 方法将日期转换为指定格式的文本
(2)、使用 parse() 方法将文本转换为日期(调用 SimpleDateFormat 对象的 parse() 方法时可能会出现转换异常,即 ParseException , 因此需要进行异常处理)
3、Calendar 类(处理日期)
(1)、java.util.Calendar 类是一个抽象类,可以通过调用 getInstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时 间初始化,即默认代表当前时间,如 Calendar c = Calendar.getInstance();
4、Math 类
Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用该类中的方法 时,可以直接使用类名.方法名,如: Math.round()