概述:
在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善
尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠
代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网
络是否始终保持通畅等等
异常抛出机制
Java中是如何表示不同的异常情况,又是如何让程序员得知,并处
Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建
的对象,并且抛出。
然后程序员可以捕获到这个异常对象,并处理;
如果没有捕获这个异常对象,那么这个异常将会导致程序终止。
异常的结构
常见的异常
运行期间
运行期间异常:在代码编译期间,编译器不作任何处理,无论代码是否会发生,编译器不会给出任何的提示,但是当代吗运行起来才会发现异常。这类代码需要程序员自己判断和处理是可以进行避免的。
//int[] a = new int[5];
//a[5] = 5; //数组索引越界 ArrayIndexOutOfBoundsException
//String s = "abcd";
//s.charAt(4); // 字符串索引越界 StringIndexOutOfBoundsException
//int a = 10;
//int b = 0;
//int c = a/b;// 算术异常 ArithmeticException
// String s = null;
// s.length(); // 空指针异常 NullPointerException
//Object s = "abcd";
// Integer a = (Integer) s; //类型转换异常 ClassCastException
int a = Integer.parseInt("abc");//数字格式化异常 NumberFormatException
System.out.println("后面的程序");
编译期间
在代码编译期间,编译器可以明确代码可能发生异常,可以提醒程序员进行编译处理,如果尅有进行编译处理,编译器会直接判定编译失败。这类代码不是由程序员的代码而引起的是客户端的输入格式或者是强制删除等不正常的操作引起的。
public int a(int sum){ if(sum==1){ return 1; } return a(sum-1); }//栈溢出,StackOverflowError public static void main(String[] args) { ArrayList arrayList=new ArrayList(); while (true){ arrayList.add(new Date()); }//堆溢出,OutOfMemoryError }
异常处理
Java的异常处理是通过5个关键字来实现的:try、catch、
finally、throw、throws
try关键字
检测不安全的代码块(发现异常) try块中任何一条语句发生了异常,下面的代码将不会被执行,程序将 跳转到异常处理代码块中,即catch块。因此,不要随意将不相关的代 码放到try块中,因为随时可能会中断执行。
try {
//写可能会出现异的代码, 需要长期积累
// Integer.parseInt("abc");
String s = null;
s.length();
int a = 10;
int b = 0;
int c = a/b;}
Catch
把抓到的类型匹配的异常捕获,保证程序能继续运行下去
catch语句必须紧跟着try语句之后,称为捕获异常,也就是异常处理函数,
一个try后面可以写多个catch,分别捕获不同类型的异常,要从子类往父类
的顺序写,否则有编译错误
捕获异常的有关信息:
与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。
• getMessage() 获取异常信息,返回字符串
• printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的
位置。返回值void
try {
//写可能会出现异的代码, 需要长期积累
// Integer.parseInt("abc");
String s = null;
s.length();
int a = 10;
int b = 0;
int c = a/b;
}catch (ArithmeticException a){//捕获出现的指定的异常对象,如果类型不匹配,就捕获不到
a.printStackTrace();//在开发期间,建议使用printStackTrace()打印异常信息
System.out.println("除数不能为0!");
}catch (NullPointerException n){
n.printStackTrace();
System.out.println("对象为null");
}catch (Exception e){ //父类类型 必须要写在 多个catch的最下面
e.printStackTrace();
System.out.println("程序异常:"+e.getMessage());
}
System.out.println("后面的代码");
}
finally
(大多数用于方法中,有返回值,有必须执行的代码)
finally
finally该内容总是会执行的,只能有一个finally语句
finally{
必须执行的逻辑
}
public static int chu(int a,int b){
try {
int c = a/b;
//System.out.println("关闭流通道");
return c;
}catch (ArithmeticException ar){
//System.out.println("关闭流通道");
ar.printStackTrace();
return -1;
}finally {
System.out.println("关闭流通道");
}