- 异常:
1.错误:
这是非常严重的问题,一般我们处理不了,一般在这里指的是硬件问题。
2.异常:
编译时期异常 :开始就必须要处理的,如果不处理,程序就运行不了。
运行时期异常 :开始可以不用处理。这种问题一旦发生,就是我们的程序问题,需要我们修改程序。
- 异常处理方案
A:try…catch…finally
B:throws
try…catch…finally:
try{
可能出现异常的代码
}catch(异常类名 变量名) {
针对异常的代码处理
}finally {
释放资源的地方
}
演示:
public class ExceptionExercise1 {
//数组越界异常和除数为0异常的多重异常处理
//A:给每一个可能出现异常的代码全部加上try..catch..
//B:针对多个异常,采用一个try,多个catch的情况。
public static void main(String[] args) {
//A:
//数组越界异常
try {
int [] arr = new int [3];
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界了");
}
//除数为0异常
try {
System.out.println(10/0);
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
}
System.out.println("----------------------");
//B:
//文件未找到+除数为0
try {
FileInputStream fis = new FileInputStream("acx.txt");
System.out.println(10/0);
} catch (FileNotFoundException e) {
System.out.println("没有这个文件啊!"); //文件未找到被处理
} catch (ArithmeticException e) {
System.out.println("除数不能为0"); //除数为0没有被处理,因为匹配到一处错误处理后
} //就会跳出try...catch...
}
}
throws:
* 用在方法声明后面,跟的是异常类名
* 可以跟多个异常类名,用,号隔开
* 表示抛出异常,由该方法的调用者来处理
* throws表示出现异常的一种可能,并不一定会发生这些异常
演示:
public static void demo1() throws IOException{
//文件未找到
//这个属于编译时有异常,必须当时就做出处理,否测编译不能通过
FileInputStream fis = new FileInputStream("acx.txt");
}
public static void demo2()throws ArithmeticException {
//除数为0
//这个属于运行时异常,不必编译当时就做出处理,也不代表一定会出现异常
System.out.println(10/0);
}
注意:
A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
上述仅仅针对编译时期异常
与运行时期异常无关。