异常
1.开发中的语法错误和逻辑错误不是异常
2.对于运行时的异常,可以不做处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
执行中的异常可分为两大类: (1)Error(错误):java虚拟机无法解决的严重问题,如:JVM系统内部错误,资源耗尽等严重情况,比如:StackOverflowError(栈溢出)和OOM(out of memory) , Error是严重错误,程序会崩溃 (2)Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理,例如空指针访问,试图读取不存在的文件,网络连接中断等等。。。。 Exception分为两大类: 运行时异常(程序运行时发生的异常) 编译时异常(编程时,编译器检查出的异常)
虚线:实现 实线:继承
常见的运行时异常
1.NullPointerException空指针异常 2.ArithmeticException数字运算异常 3.ArrayIndexOutOfBoundsException数组下标越界异常 4.ClassCastException类型转换异常 5.NumberFormatException数字格式不正确异常
//1.NullPointerException空指针异常 public class Test { public static void main(String[] args) { String name = null; //空指针异常 System.out.println(name.length()); } }
//2.ArithmeticException数字运算异常 public class Test { public static void main(String[] args) { int num1 = 10; int num2 = 0; //数字运算异常 int res = num1 / num2 ; } }
//3.ArrayIndexOutOfBoundsException数组下标越界异常 public class Test { public static void main(String[] args) { int[] arr = {12 , 33 , 66 , 99}; for (int i = 0; i <= arr.length; i++) { System.out.print(arr[i] + " "); } } }
//4.ClassCastException类型转换异常 public class Test { public static void main(String[] args) { A b = new B(); //向上转型 B b1 = (B)b; //向下转型 //类型转换异常 C b2 = (C)b; } } class A{ } class B extends A{ } class C extends A{}
//5.NumberFormatException数字格式不正确异常 public class Test { public static void main(String[] args) { String name = "张三"; //数字格式不正确异常 int num = Integer.parseInt(name); } }
常见的编译异常
SQLException操作数据库时,查询表可能发生的异常 IOException操作文件时,发生异常 FileNotFoundException操作一个不存在文件时,发生异常 ClassNotFoundException加载类,而该类不存在时,发生异常 EOFException操作文件,到文件末尾,发生异常 ILLegalArguementException参数异常
try-catch异常处理
1.try - catch - finally 程序员在代码中捕获发生的异常,自行处理 try { int num; //代码、可能有异常 } catch (Exception e) { e.printStackTrace(); //捕获到异常,当异常发生时,系统将异常封装成Exception 对象 e 传递给catch //得到异常对象后,程序员,自己处理 //没有异常发生不执行catch }finally { //不管是否有异常发生,始终要执行finally //finally通常将释放资源的代码放在这里 } 2.throws 将发生的异常抛出,交给调用者来处理,最顶级的处理者就是JVM
细节
1.如果异常发生了,则异常后面的代码不会执行,直接进入到catch块
2.如果异常没有发生,则顺序执行try不会进入到catch
3.如果希望不管是否发生异常,都执行某段代码块(比如关闭连接 ,释放资源等)执行try - catch - finally
4.可以有多个catch语句,捕获多个不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,,如果发生异常只会匹配一个catch
5.可以进行 try-catch 配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉、退出。应用场景:不管是否发生异常,都必须执行某个业务逻辑
总结
1.先执行try,再执行catch,再执行finally,最后执行return(return返回的数值如果在finally前面,需要先将数值保存到temp中)
throws异常处理(抛出异常)
1.子类重写父类方法时,对抛出的异常规定:子类重写方法抛出的异常要么与父类抛出的一致,要么为父类抛出异常类型的子类型
2.try-catch 与抛出异常(throws)二选一
3.抛出编译异常谁调用谁处理,抛出运行异常不要求程序员显示处理,有默认的处理机制
`