异常:
异常的产生:
代码错误,抛出异常的情况
public static void main(String argsp[]) {
int i = 10;
int j = 0;
System.out.println("============= 计算开始 =============");
int temp = i / j; // 进行除法运算
System.out.println("temp ="+ temp);
System.out.println("============= 计算结束 =============");
}
上述代码在“int temp = i / j ;”位置处产生了异常,一旦产生异常之 后,异常之后的语句将不再执行了,所以现在的程序并没有正确地执行完毕就退 出了。
Throwable类是所有异常的父类
1) Error表示很难恢复的错误,如内存越界。一般不期望用户程序来处理,即使 程序员有能力处理这种错误,也还是交给系统处理为好。
2) RuntimeException用来表示设计或实现方面的问题,如数组越界等。因为设计 和实现正确的程序不会引发这类异常,所以常常不处理它。发生这类异常时,运行时 环境会输出一条信息,提示用户修正错误。
3) 其他异常表示运行时因环境的影响可能发生并可被处理的问题。如文件没找到 或存在不完整的URL等。因为用户的错误很可能导致这类问题发生,比如用户键入的 内容不正确,所以Java鼓励程序员处理它们。
try、catch、 finally、throw、throws
try 执行可能产生 异常的代码
catch 捕获异常
finally 无论是否发生异常,代码总能执行
throw 手动抛出一个异常类的对象
throws 声明方法可能要抛出的各种异常
Ø try语句 try{……}语句制定了一段代码,这段代码就是一次捕获并处理例外的范围。 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的 catch语句要分别对这些异常做相应的处理。如果没有例外发生,所有的catch代码段都 被略过不执行。
Ø catch语句 在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个 catch语句,用于处理可能产生的不同类型的异常对象。 在catch中声明的异常对象(catch(SomeException e))封装了异常事件发生的信 息,在catch语句块中可以使用这个对象的一些方法获取这些信息。 例如: getMessage()方法,获取异常信息,返回字符串。 printStackTrace()方法,获取异常类名和异常信息,以及异常出现在程序中的位 置,返回值void。 printStaceTrace(PrintStreams) 方法,通常用该方法将异常内容存储在日志文件中, 以便查阅。
finally语句
finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分 以前,能够对程序的状态做统一的管理。 无论try所指定的程序块中是否抛出例外,finally所指定的代码都要执行。
通常在finally语句中可以进行资源的清除工作,如:
1) 关闭打开的文件
2) 删除临时文件 Ø
throw和throws 的区别:
1) throws用于标识函数暴露出的异常;throw用于抛出异常对象。
2) throws用在函数上,后面跟异常类名;throw用在函数内,后面跟异常对象。 3) 定义功能方法时,就通过throws在函数上标识;在功能方法内部出现某种情 况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
使用try-catch块捕获异常,分为三种情况:
第一种情况
public void method(){
try {
// 代码段(此处不会产生异常)
} catch (异常类型 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
第二种情况
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
第三种情况
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
抛出异常 throw throws
如果一个Java方法碰到自己无法处理的情况,就应该抛出一个异常。它的原理其 实很简单,一个方法不仅仅要告诉编译器它会返回什么样的值,还要告诉编译器什么 样的错误可能发生。
捕获异常
在抛出异常过程中,异常抛出后就可以不用管它了。但是在有些代码中就必须 捕捉这些异常。为了捕捉异常需要使用try-catch语句编写错误处理过程,其语法格 式如下:
try{ 需要检测的代码;
}catch(异常类 变量){
异常处理代码;
}
如果try块内的任何代码抛出了由catch子句制定的异常,则:
1) 程序跳过try块中的其他代码;
2) 程序执行catch子句中的处理代码。
例:
public class Student {
private char sex;
public char getSex() {
return sex;
}
public void setSex(char sex) throws Exception {
if (sex == '男' || sex == '女') {
this.sex = sex;
} else {
throw new Exception("性别必须是男或者女!");
}
}
}
public static void main(String[] args) {
Student s=new Student();
try {
s.setSex('红');
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(s.getSex());
}
}
例:
public static void main(String[] args) {
System.out.println("请输入课程代号(1~3之间的数字):");
Scanner scan=new Scanner(System.in);
try{
int num=scan.nextInt();
if(num==1){
System.out.println("C#课程");
}if(num==2){
System.out.println("JAVA课程");
}if(num==3){
System.out.println("Android课程");
}
}catch(InputMismatchException e){
e.printStackTrace();
}
finally{
System.out.println("欢迎提出建议!");
}
}
常见的异常类型
Exception 父类 异常层次结构的根类
ArithmeticException 算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问 null 对象成员
ClassNotFoundException 不能加载所需的类
InputMismatchException 欲得到数据类型与实际输入类型不匹配
IllegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把"abc"转换成数字
try块不能独立存在