------- android培训、java培训、期待与您交流! ----------
异常处理的基本语法:
try{
//可能会出现异常的代码
}catch(异常类型名称 变量名){
//可以将catch中的代码称为:异常处理程序
//如果try中的代码发生异常,那么虚拟机会执行catch中的代码
}
执行顺序:
1.执行try中的代码;
2.如果try中的代码没有异常,不会执行catch中的代码,会继续执行"try...catch"语句的后续代码;
3.如果try中的代码出现了异常,会立即执行catch中的代码。如果catch中的代码执行完毕,会执行"try...catch"语句的后续代码;
public class Demo {
public static void main(String[] args) {
int a = 10;
int b = 0;
try{
System.out.println("a / b : " + (a / b));
System.out.println("try中的后续代码......");
}catch(ArithmeticException e){
System.out.println("不好,发生异常了,这里是catch中的代码,会被执行!");
}
System.out.println("程序结束");
}
}
异常分类:
Throwable(类):
|--Error:表示错误。我们不用处理;
|--Exception:表示异常
|--RuntimeException:运行时异常:编译时可以不处理,运行时会抛出的异常;
|--除RuntimeException类型的其它异常:非运行时异常:编译期就要处理的异常,否则编译不通过。尤其是一个方法内,如果产生了一个"非运行时异常",调用方 必须去处理这个异常,否则不能通过编译。
finally关键字的特点及作用
1.finally关键字,用于"异常处理"的语句中。
2.它一般用于try后或try...catch后;
3.特点:在finally语句块中的代码,无论是否出现异常,都会被执行;
一般操作一个文件包括三个流程:打开文件、读写文件、关闭输入输出流;
try{
System.out.println(”打开文件");
System.out.println(”读取文件");//出现异常
return 一个值;
}catch{
System.out.println("异常处理");
}finally{
System.out.println(”关闭文件");//这个操作不论是否出现异常都会被执行
}
4.无论是否发生异常,finally中的语句肯定会被执行:
执行顺序:
无异常:try --> finally
有异常:try --> catch --> finally
自定义异常:
1.我们知道一个方法只能返回一个值。
2.假如一个方法接收一个"年龄"值,方法内会进行运行。
形参:int类型
可能接收的值:所有int范围内的值;
如果接收到一个负数,我们的方法怎么做,可以告知调用者?
3.抛出一个"自定义异常";
4.怎样自定义异常:
1).定义一个类,继承自Exception或它的某个子类;
2).提供一个默认的构造方法,或者一个带一个String类型的构造方法,以指定"异常信息";
3).使用时,在某个方法内直接throw 一个自定义异常对象就可以。
注意:如果一个类继承自Exception,按"非运行时异常"规则处理;
如果我们想自定义一个"运行时异常",继承自RuntimeException或它的子类即可。
lass AgeException extends Exception {
//提供构造方法,接收异常信息
public AgeException(String info){
super(info);
}
}
class Student{
private int age;
public void setAge(int age) throws AgeException{
if(age < 15 || age > 50){
//不接收这样的年龄,怎样告知调用者
//抛出异常;
//抛出什么类型的异常?类库中的异常类肯定是不行了,因为没有代表这种异常的类;
//就需要我们自定义一个异常类:
throw new AgeException("年龄必须在15到50之间!");
}
this.age = age;
}
}
public class Demo {
public static void main(String[] args) {
Student stu = new Student();
try {
stu.setAge(-200);
} catch (AgeException e) {
System.out.println("调用setAge()方法出现异常,异常信息:" + e.getMessage());
}
}
}
在继承关系时异常的声明:
一.父类方法没有声明异常:
子类:1.可以不声明抛出异常;
2.可以抛出"运行时异常";
3.不能抛出"非运行时异常";
二.父类方法声明抛出"运行时异常":
子类:1.可以不声明抛出异常;
2.可以抛出任何的"运行时异常";
3.不能抛出"非运行时异常"
三.父类方法声明抛出"非运行时异常":
子类:1.可以不声明抛出异常;
2.可以抛出任何的"运行时异常";
3.可以抛出跟父类相同的"非运行时异常",但不能抛出其它的"非运行时异常"