Java异常
什么是异常?
程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止
异常并不是语法错误,语法错误的话编译不会通过,不会产生字节码文件,根本运行不起来
异常的抛出机制:
Java中把不同的异常用不同的类表示,发生某种异常就创建该异常类型的对象,并且抛出。
常见异常:
int[] a=new int[5];a[5]=10;//ArrayIndexOutOfBoundsException 数组索引超出范围String s="abc";s.charAt(6);//StringIndexOutOfBoundsException 字符串索引超出范围int a=1,b=0,c=a/b;//ArtithmeticException 算数异常String s=null;s.charAt(1);//NullPointerException 空指针异常Object s="abc";Integer i=(Integer)s;//ClassCastException 类型转换异常int a=Integer.parseInt("abc");//NumberFormatException 数字格式化异常
/*
Exception in thread“main"java.lang.0ut0fMemoryError: Java heap space 内存不够用了,程序无法处理
*/
ArrayList a=new ArrayList();while(true){a.add(new Date());}public static int sum(int n){if(n==1){return 1;}else{return sum(n-1);}}
sum(100000);//StacjOverflowError栈不够用
java异常体系结构
Throwable:Error和Exception
对应:java.lang.Error java.lang.Exception
java.lang.Throwable: 是java异常体系中的根类里面有两个常用的方法:
public void printstackTrace(): //打印栈中的异常信息public String getMessage() : //获取到异常信息
Error:java虚拟机无法解决的严重问题。如:JVM系统内部错误,资源耗尽等问题。一般不会编写针对性代码处理
如:StackOverflowError(栈内存溢出)和OutOfMemoryError(堆内存溢出)简称OOM
Exception:其他因变成错误或偶然的外在因素导致的一般问题,需要写针对性代码使程序能正常运行,否则一旦发生异常,程序也会挂掉
处理异常:
把可能出现异常的代码放入try,用catch来捕获显示异常信息,finally一定会在最后执行,try和catch中有return则先finally再return
try{写代码,可能会出现异常
}catch(异常类型 a){捕获指定类型的异常
}finally{最终必须要执行的代码(无论是否出现异常)
}
try{int[] arr=new int[5];arr[5]=10;String s="abc";s.charAt(6);int a=1,b=0,c=a/b;}catch (ArithmeticException a){ //捕获出现的指定的异常对象,如果类型不匹配,就捕获不到a.printStackTrace();System.out.println("除数不能为0!");}catch (NullPointerException n){n.printStackTrace();System.out.println("对象为null");}catch (Exception e){e.printStackTrace();System.out.println("程序异常:"+e.getMessage());}finally {System.out.println("关闭流通道");}
FileInputStream inputStream=null;try{inputStream=new FileInputStream("D:/ccc.txt");inputStream.read();}catch (FileNotFoundException e){e.printStackTrace();System.out.println("文件找不到");}catch (IOException io){io.printStackTrace();System.out.println("读文件异常");}finally {//在finally代码块中必须关闭流通道if(inputStream!=null){inputStream.close();}}
throws和throw:
定义一个方法的时候可以用throws声明,表示此方法不处理异常,而交给方法调用处进行处理
public void test throws 异常1,异常2,异常3{
}
任何方法都可以使用throws声明异常类型,包括抽象方法
运行期异常和编译期异常:
public static int chu(int x,int y)throws ArithmeticException{int z=x/y;return z;}public static void test()throws UnsupportedEncodingException {"abc".getBytes("utf-8");}public static void main(String[] args) {chu(10,0);//由于chu的方法是运行期异常,所以编译期间不会要求强制处理test();//由于test方法中抛出的是一个编译期异常,所以在编写代码期间,就强制要求进行处理//处理方法:1.try catch捕获 2.继续throws 一般到了顶层的方法就不能再throwstry{test();}catch (UnsupportedEncodingException e){e.printStackTrace();}}/*在方法声明的地方,通过throws关键字 声明此方法可能会出现异常使用throws抛出异常对象,表示此方法不处理异常,交给调用这个方法的地方进行处理,一般在底层的方法中,都不进行处理*/