java采用面向对象的方式来处理异常。
处理过程:
1.抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE
2.捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常,JRE在方法的调用栈中查找,从生成异常的方法开始回溯,知道找到相应的异常处理代码为止
运行时异常都要人工去检查处理
RuntimeException:可以通过编译,运行时错误
package 异常;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=0;
int b=1;
if(a!=0){
System.out.println(b/a);
}
String str=null;
if(str!=null){ //对象一定要有指向,NullPointException
System.out.println(str.length());
}
//ClassCastException
Animal d=new Dog();
if(d instanceof Cat){//判断d是否为Cat或它子类的实例
Cat c=(Cat)d;
}
//ArrayIndexOutOfBoundsException
int[] arr=new int[5];
int e=5;
if(e<arr.length){
System.out.println(arr[e]);
}
//NumberFormatException
//String str1="123cf"; cf不是字符型的数字
//System.out.println(Integer.parseInt(str1));
String str1="123abcf";
Pattern p=Pattern.compile("^\\d+$");
Matcher m=p.matcher(str1);
if(m.matches()){ //如果str1匹配代表数字的正则表达式,才会转换
System.out.println(Integer.parseInt(str1));
}
}
}
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}
CheckedException:不能通过编译
解决办法:1,使用"try/catch"捕获异常
2,使用"throws"声明异常
如果在语句1中遇到异常,然后异常抛出,找到对应的异常执行对应的catch下的语句,语句2不会再执行。可以有多个catch语句,final只能有一个
package 异常;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) {
FileReader reader=null;
try{
reader=new FileReader("C:/Users/黄文凯/Desktop/新建文件夹/a.txt");
char c1=(char)reader.read();
System.out.println(c1);
}catch(FileNotFoundException e){ //子类异常在前,父类异常在后写
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try {
if(reader!=null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
当使用throws处理异常,谁调用谁处理,如果不处理,则继续向上抛异常,可以到main方法再到JRE,最后还是有异常