1.1异常的描述
在程序中,异常可能由程序员没有预料到的各种情况产生,也可能由超出了程序员可控范围的环境因素产生,如用户的坏数据、试图打开一个根本不存在的文件等。在java中,这种在程序运行时可能出现的一些错误成为异常
如下列代码1.1:
public class test {
public static void main(String[] args)
{
int result = 3 / 0 ;
System.out.println(result);
}
}
运行结果为
程序运行的结果报告发生了算术异常 ,系统不在向下执行,提前结束。这种情况就是所说的异常。
1.2 异常的抛出与捕捉
1.2.1 抛出异常
异常抛出后,如果不做处理,程序将会终止,如代码1.1 。
又例如代码1.2,将一个字符串转为整形,如果该字符串不是数字,parseInt()方法将抛出异常,程序将在出现异常的位置终止,不再执行接下来的语句。
public class test {
public static void main(String[] args)
{
String str = "lili" ;
System.out.println(str + "age:");
int age = Integer.parseInt("20l");
System.out.println(age);
}
}
结果如下:
由上述结果可以看出,“liliage:” 成功输出,但age没有输出,所以程序在字符串转换前没有异常,在其之后程序开始终止。
1.2.3 捕捉异常
java语言的异常捕获结构由 try 、catch 、finally 3部分组成。其中try语句存放的是可能发生异常的java语句;catch语句放在try语句块之后,用来激发异常;finally语句是异常处理结构的最后执行部分,无论try 的代码如何退出,finally 语句都将被执行
语法如下:
try{
//代码块
}
catch (Exception1 e){
//处理语句
}
catch (Exception2 e){
//处理语句
}
.....
finally{
//处理语句
}
1.try-catch语句
这时我们将代码1.2改写为try-catch语句编写为如下代码(代码1.3) :
public class test {
public static void main(String[] args)
{
try {
String str = "lili";
System.out.println(str + "age:");
int age = Integer.parseInt("20l");
System.out.println(age);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("Program over");
}
}
结果如下:
以上可以看出,程序仍然输出最后的提示信息,并没有因为异常而终止程序。当try语句出现异常时,将自动跳转到catch语句进行异常处理,而try出现异常后面的语句并没有 被继续执行。
2.finally语句
完整的异常处理过程一定包含finally语句,无论程序是否有异常发生,并且无论之前的try-catch语句块是否顺利正常进行,都会执行finally语句。以下4种特殊情况下,finally不会被执行:
- 在finally语句出现异常
- 前面的代码使用了System.exit()程序
- 程序所在线程死亡
- 关闭CPU
1.3 Java常见的异常类
异常类 | 说明 |
ClassCastException | 类型转换异常 |
ArithmeticException | 算术异常 |
ArrayIndexOutOfBoundException | 数组下标越界异常 |
NullPointerException | 空指针异常 |
NumberFormatException | 字符串转数字抛出的异常 |
StringIndexOutOfBoundException | 字符串索引超出范围抛出的异常 |
FileNotFoundException | 文件未找到异常 |
1.4 自定义异常
用户可继承Exception类来自定义异常。在程序中使用自定义异常,大体可分为以下步骤:
1) 创建自定义类
2)在方法中通过抛出throw关键字抛出异常对象
3) 如果在当前抛出异常的方法中处理异常,可使用try- catch 语句捕获并处理
4) 在出现异常的方法的调用者中捕获并处理异常。
语法如下:
public class MyException extends Exception{
public MyException(String[] ErrorMessage){
super(Exception);
}
}
public class Tran{
static int avg() throws MyExcepton{ //定义方法,抛出异常
//判断错误信息的代码块
}
public static void main(String[] args){
try{
//调用avg()方法
}catch{
//处理
}
}
}
1.5 在方法中抛出异常
如果某个方法可能发生异常,并且不想在当前方法处理,则可以使用throws、throw在方法中抛出异常。
1.5.1 使用throws抛出异常
throws关键字被应用于声明方法时,用来指定方法可能抛出的异常,可抛出多个异常。如1.4中自定义异常类语法中使用throws将异常抛出。
1.5.2 使用throw抛出异常
throw关键字通常用于方法体中,并且抛出一个异常。
语法如下:
public class MyException extends Exception{
public MyException(String[] ErrorMessage){
//自定义方法
}
}
public class Tran{
static int avg() throws MyExcepton{ //定义方法,抛出异常
throw new MyException//判断错误信息,同时抛出异常信息
}
public static void main(String[] args){
try{
//调用avg()方法
}catch{
//处理
}
....
}
}