java.lang.ArithmeticException:算术异常
java.util.InputMismatchException:输入不匹配
java.lang.ArrayIndexOutOfBoundsException:数组下标越界
异常(例外):程序在执行的过程中出现意外的情况,导致程序中断执行
Java中的异常处理机制: try...catch...finally throws throw
try..catch..finally语法: 类比多重if...else if...else if...else条件结构记忆
try:保存的可能出现异常的代码
catch:处理异常的代码或消息;只有发生的异常与指定的异常类型相匹配时才会执行
try{
//可能出现异常的代码
}catch(异常类型 对象名){
//处理异常的代码或消息
}catch(异常类型2 对象名){
//处理异常的代码或消息
}....
}finally{
//不论异常是否发生都会执行的代码(释放资源)
}
public class TestException1 { public static void main(String[] args) { /* *计算N个学员的总成绩和平均成绩 */ int sum=0;//总成绩 int avg=0;//平均成绩 System.out.println("请输入学员人数:"); Scanner input = new Scanner(System.in); try{ int num = input.nextInt(); int[] scores = new int[num];//声明一个数组用于保存成绩 for(int i=0;i<num;i++){ System.out.println("请输入第"+(i+1)+"个人的成绩:"); scores[i]=input.nextInt();//将学员成绩保存到数组中 sum+=scores[i];//计算总成绩 } avg=sum/num;//平均成绩 }catch(InputMismatchException e){ System.err.println("您输入的人数必须为数字,请重新输入!"); // System.err.println(e.getStackTrace());//输出异常对象堆栈信息 e.printStackTrace();//打印异常对象的堆栈信息 }catch(ArithmeticException e){ System.err.println("除数不能为零!"); e.printStackTrace(); } System.out.println("总成绩:"+sum+",平均成绩:"+avg); } }
java.lang.Exception类:所有异常类(XxxxxException)的父类
public class TestException2 { public static void main(String[] args) { /* *计算N个学员的总成绩和平均成绩 */ int sum=0;//总成绩 int avg=0;//平均成绩 System.out.println("请输入学员人数:"); Scanner input = new Scanner(System.in); try{ int num = input.nextInt(); int[] scores = new int[num];//声明一个数组用于保存成绩 for(int i=0;i<num;i++){ System.out.println("请输入第"+(i+1)+"个人的成绩:"); scores[i]=input.nextInt();//将学员成绩保存到数组中 sum+=scores[i];//计算总成绩 } avg=sum/num;//平均成绩 }catch(Exception e){ System.err.println("程序出现了异常!"); // System.err.println(e.getStackTrace());//输出异常对象堆栈信息 e.printStackTrace();//打印异常对象的堆栈信息 } System.out.println("总成绩:"+sum+",平均成绩:"+avg); } }
catch:处理异常的代码或消息;只有发生的异常与指定的异常类型相匹配时才会执行
只有当程序的异常被捕获并处理后,程序才能继续执行
注意:如果有多个catch块,其中catch中的异常类型范围应该从小到大
出现异常后,try块中尚未执行的语句不会执行
出现异常后并处理后,catch块后面的语句还会执行
public class TestException3 { public static void main(String[] args) { /* *计算N个学员的总成绩和平均成绩 */ int sum=0;//总成绩 int avg=0;//平均成绩 System.out.println("请输入学员人数:"); Scanner input = new Scanner(System.in); try{ int num = input.nextInt(); int[] scores = new int[num];//声明一个数组用于保存成绩 for(int i=0;i<num;i++){ System.out.println("请输入第"+(i+1)+"个人的成绩:"); scores[i]=input.nextInt();//将学员成绩保存到数组中 sum+=scores[i];//计算总成绩 } avg=sum/num;//平均成绩 }catch(InputMismatchException e){ System.err.println("输入不匹配异常!"); e.printStackTrace();//打印异常对象的堆栈信息 }catch (Exception e) { System.err.println("程序出现了异常!"); e.printStackTrace(); } System.out.println("总成绩:"+sum+",平均成绩:"+avg); } }
public class TryCatchDemo { public static void main(String[] args) { try{ System.out.println("try....1"); int num=10/0; System.out.println("try....2"); }catch(InputMismatchException e){ System.out.println("catch...."); e.printStackTrace(); } System.out.println("end....."); } }
空指针异常:java.lang.NullPointerException
产生原因:试图对空对象操作(访问空对象的属性或访问空对象的方法)
类找到异常:ClassNotFoundException
产生原因:要加载的类无法找到
public class Student{ String name; public void show(){ System.out.println("姓名:"+name); } public static void main(String[] args) { Student stu=null; // stu.name="张三"; try{ // stu.show(); Class.forName("java.lang2.String");//加载指定的类 }catch(NullPointerException e){ System.err.println("对象不能null,请对对象进行创建!"); }catch(ClassNotFoundException e){ System.err.println("类找到异常,请检查全类名!"); } System.out.println("end...."); } }
try{
}catch(异常类型 对象名){
}....
}finally{
//总是会被执行的代码
}
finally中代码总是会被执行,它执行在return之前。
只有一种情况finally中的代码才不会执行:调用System.exit(1):终止正在运行的JVM
通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。
public class TryCatchFinally { public static void main(String[] args) { //情况1 // try { // System.out.println("try....1"); // int num=10/0; // System.out.println("try....2"); // } catch (Exception e) { // System.out.println("catch...."); // }finally{ // System.out.println("finally...."); // } // System.out.println("end...."); //情况2 // try { // System.out.println("try....1"); // int num=10/0; // System.out.println("try....2"); // } catch (ClassCastException e) { // System.out.println("catch...."); // }finally{ // System.out.println("finally...."); // } // System.out.println("end...."); //情况3 // try{ // System.out.println("try...."); // int num=10/0; // System.out.println("try....2"); // }finally{ // System.out.println("finally...."); // } // System.out.println("end..."); //面试题: try{ System.out.println("begin....1"); int a=10; int b=0; System.exit(1);//终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。 int c=a/b; System.out.println("begin....2"); // return; }catch(Exception e){ System.out.println("catch...."); }finally{ System.out.println("finally...."); } System.out.println("----------------------"); try{ int a=10; System.out.println("try...a="+a); return; }finally{ System.out.println("finally..."); } } }
finall遇到return关键字,先执行finally中的代码。
public class TryFianlly { public static int test(){ try{ return 1; }finally{ return 2; } } public static void main(String[] args) { int a = test(); System.out.println("a="+a); try { Class.forName("java.lang.String"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
throws:声明方法时,定义该方法抛出的异常类型。谁调用谁处理。
语法:
修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2....{
}
throw:在方法中抛出异常对象,throw关键字后边跟的异常对象,调用者可以继续对所抛出的异常进行处理
throws和throw的区别:
1.位置不同:
throws在方法声明时
throw在方法体中
2.类型和个数不同
throws后跟的是异常类型,可以是多个
throw后跟的是异常对象,一个
3.作用不同
throws声明方法是抛出异常,告知调用者方法中存在异常的风险
throw是方法处理过程中将异常对象抛出,调用者可以进一步对异常对象进行处理
public class ThrowsDemo { public void test() throws ClassNotFoundException{ try{ Class.forName("java.lang.Scanner"); }catch(ClassNotFoundException e){ System.err.println("无法加载指定的类...1"); } } public void test2() throws ClassNotFoundException{ try{ Class.forName("java.lang.Scanner"); }catch(ClassNotFoundException e){ System.err.println("无法加载指定的类..."); throw e;//抛出异常 } } public static void main(String[] args) { ThrowsDemo throwsDemo = new ThrowsDemo(); try{ throwsDemo.test2(); }catch(ClassNotFoundException e){ System.err.println("无法加载指定的类2..."); } } }
自定义异常:
1. 编写一个Exception或RuntimeException的子类
2. 提供两个构造函数:无参和有参
public class SexException extends Exception{ public SexException(){ } public SexException(String message){ super(message); } @Override public String toString() { //super.getMessage():获取父类中的异常消息 return "SexException ["+super.getMessage()+"]"; } }
捕获异常的快捷键:
1.选中检查异常的代码
2.shift+alt+z
public class Student { private String name; private String sex; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } /** * 通过自定义异常完成性别的检测 * @param sex * @throws SexException */ public void setSex(String sex) throws SexException { if(sex.equals("男")||sex.equals("女")){ this.sex = sex; }else{ throw new SexException("性别只能是男或女!"); } } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show(){ System.out.println("姓名:"+name); System.out.println("性别:"+sex); System.out.println("年龄:"+age); } public static void main(String[] args) { Student student = new Student(); student.setName("zhangsan"); student.setAge(20); try { student.setSex("男女男"); } catch (SexException e) { System.err.println(e.getMessage());//获取异常消息 e.printStackTrace(); } student.show(); } }