异常:
程序在运行过程中,发现的意外情况(不符合预期的情况)。异常会导致程序中断。程序无法执行完毕。
异常的捕获:
异常处理使得开发者可以应对可能出现的异常,进行处理,使程序依然执行,并有效。
基本用法:
try{
//正常业务逻辑,仅放置可能会出现异常的代码部分
}catch(Exception e){
//异常处理代码。如何处理异常
}
例子:
package com.situ.chapter2;
public class Test2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] a = {1,2,3,4,5};//语法糖,简写
try {
a[100] = 10;
}catch(Exception e) {
e.printStackTrace();//输出异常位置类型
System.out.println("异常!");
}
}
}
运行截图:
catch:
catch表示要捕获何种类型的异常
catch 分支可以写多个,表示捕获不同类型的异常。
但是对于初学者来说,掌握Exception 的类型使用即可。
Exception 是所有异常类型的顶级父类。只是其他异常是Exception异常的子类。
可以在一个catch分支捕获多种类型的异常,使用 | 进行分割
catch分支例子
int[] a = {1,2,3,4,5};//语法糖,简写
try {
a[100] = 10;
}catch( ArithmeticException e) {
e.printStackTrace();//输出异常位置类型
System.out.println("数学异常!");
}catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
System.out.println("数组下标越界异常!");
}
int[] a = {1,2,3,4,5};//语法糖,简写
try {
a[100] = 10;
}catch(ArithmeticException|ArrayIndexOutOfBoundsException e) {
e.printStackTrace();//输出异常位置类型
System.out.println("异常!");
}
常见的异常类型:
1. ArithmeticException 数学异常
2. ArrayIndexOutOfBoundsException 数组下标越界异常
3. NullPointerException 空指针异常
4. NumberFormatException 数字格式化异常
5. ClassNotFoundException 类未找到异常
6. IndexOutOfBoundsException 索引超出范围异常
throws:
当本方法中异常无法处理,或者不想处理,或者不适合处理,可以通过throws将异常实例抛出给上层调用者,由上层调用者来处理。
所有的异常都是通过throws一层层往上抛,最终抛到Exception异常,这个异常又抛给main函数,最终main函数抛给java虚拟机,虚拟机返回出错原因和位置。
所有的函数都包含throws方法,只是省略了。
finally:
finally 表示无论如何都会执行,不管是否出现异常。
即在finally之前,已经执行了return ,finally依然会执行,但不影响返回值。
int sum =0;
try {
for(int i=0;i<=100;i++) {
if(i<100) {
sum+=i;
}
}
}catch(Exception e) {
System.err.println("异常!");
}finally {
sum=-100;
}
System.out.println(sum);
因为fianlly必须执行,所以sum=-100
throw:
虽然和throws关键词相像,但是它的作用是手动抛出(触发,创造)一个异常(可以自定义)。
例子
public class Test2 {
private static final Exception ExceptionInstance = null;
public static void main(String[] args) {
// TODO 自动生成的方法存根
/*
* int[] a = {1,2,3,4,5};//语法糖,简写
*
* try { a[100] = 10; }catch(ArithmeticException|ArrayIndexOutOfBoundsException
* e) { e.printStackTrace();//输出异常位置类型 System.out.println("异常!"); }
*/
int sum =0;
try {
sum++;
throw ExceptionInstance;
//sum++;//这里编译器会报错,因为之前出像异常,程序不会执行到这里
}catch(Exception e) {
System.out.println("异常!");
}finally {
sum++;
}
System.out.println(sum);
}
}
运行结果:
有关于异常的面试题:
1.throws和throw有什么区别吗?
如上文。
2.final和finally有什么区别吗?
final是修饰符表示最终的,不可被修改的,其他修饰类、对象、变量的作用,大家可以自行上网找找。
fianlly:如上文。
答案就在上文中了,大家可以仔细读一下。