一、理解异常及异常处理的概念
异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。
异常不是错误
程序中关键的位置有异常处理,提高程序的稳定性
二、掌握Java异常处理机制
Java的异常处理是通过5个关键字来实现的
try:尝试,把有可能发生错误的代码放在其中,必须有
catch:捕获,当发生异常时执行
finally:最终,不管是否有异常都将执行
throw:抛出,引发异常
throws:抛出多个,声明方法将产生某些异常
三、掌握try 、catch 、 finally 处理异常
3.1、try..catch
package com.zhangguo.chapter6.d1; import java.util.Scanner; public class Exception1 { public static void main(String[] args) { Scanner input=new Scanner(System.in); //int i=input.nextInt(); int i=Integer.parseInt(input.next()); System.out.println("您输入的是:"+i); System.out.println("程序结束了"); } }
异常处理:
package com.zhangguo.chapter6.d1; import java.util.Scanner; public class Exception1 { public static void main(String[] args) { try { Scanner input = new Scanner(System.in); int i = Integer.parseInt(input.next()); System.out.println("您输入的是:" + i); } catch (Exception exp) { System.out.println("发生异常了:" + exp.getMessage()); } System.out.println("程序结束了"); } }
结果:
3.2、try..catch..finally
finally在任何情况下都将执行,正常时会执行,不正常也会执行
package com.zhangguo.chapter6.d1; import java.util.Scanner; public class Exception1 { public static void main(String[] args) { try { Scanner input = new Scanner(System.in); int i = Integer.parseInt(input.next()); System.out.println("您输入的是:" + i); } catch (Exception exp) { System.out.println("发生异常了:" + exp.getMessage()); }finally { System.out.println("输入结束"); } System.out.println("程序结束了"); } }
结果:
1
您输入的是:1
输入结束
程序结束了
如果用户输入是的xyz
四、掌握throw 抛出异常、throws 声明异常
4.1、java中常用的异常
//算术异常 ArithmeticExecption //空指针异常类 NullPointerException //类型强制转换异常 ClassCastException //数组负下标异常 NegativeArrayException //数组下标越界异常 ArrayIndexOutOfBoundsException //违背安全原则异常 SecturityException //文件已结束异常 EOFException //文件未找到异常 FileNotFoundException //字符串转换为数字异常 NumberFormatException //操作数据库异常 SQLException //输入输出异常 IOException //方法未找到异常 NoSuchMethodException //抽象方法错误,当应用试图调用抽象方法时抛出 java.lang.AbstractMethodError //断言错误,用来指示一个断言失败的情况 java.lang.AssertionError //类循环依赖错误,若检测到类之间循环依赖则抛出该异常 java.lang.ClassCircularityError //类格式错误 java.lang.ClassFormatError //错误基类,标识严重程序运行问题,不应被应用程序捕获的反常情况 java.lang.Error //非法访问错误,违反域或方法的可见性声明 java.lang.IllegalAccessError //不兼容的类变化错误,当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常 java.lang.IncompatibleClassChangeError //实例化错误,构造一个抽象类或者接口时抛出该异常 java.lang.InstantiationError //内部错误 java.lang.InternalError //链接错误 java.lang.LinkageError //未找到类定义错误,找不到该类的定义时抛出该错误 java.lang.NoClassDefFoundError //域(成员变量,字段)不存在错误 java.lang.NoSuchFieldError //方法不存在错误 java.lang.NoSuchMethodError //内存不足错误 java.lang.OutOfMemoryError //堆栈溢出错误,如递归调用的层次太深 java.lang.StackOverflowError //线程已结束 java.lang.ThreadDeath //未知错误 java.lang.UnknownError //未满足的链接错误 java.lang.UnsatisfiedLinkError //不支持的类版本错误 java.lang.UnsupportedClassVersionError //验证错误 java.lang.VerifyError //虚拟机错误 java.lang.VirtualMachineError //算术条件异常,如整数除零 java.lang.ArithmeticException //数组索引越界异常 java.lang.ArrayIndexOutOfBoundsException //数组存储异常,存放非数组声明类型 java.lang.ArrayStoreException //类型转换异常 java.lang.ClassCastException //找不到类异常 java.lang.ClassNotFoundException //克隆不支持异常,如没有实现Cloneable接口 java.lang.CloneNotSupportedException //枚举常量不存在异常 java.lang.EnumConstantNotPresentException //根异常 java.lang.Exception //非法访问异常 java.lang.IllegalAccessException //非法的监控状态异常 java.lang.IllegalMonitorStateException //非法的状态异常 java.lang.IllegalStateException //非法的线程状态异常 java.lang.IllegalThreadStateException //索引越界异常 java.lang.IndexOutOfBoundsException //实例化异常 java.lang.InstantiationException //被中断异常 java.lang.InterruptedException //数组大小为负值异常 java.lang.NegativeArraySizeException //属性不存在异常,当访问某个类的不存在的属性时抛出该异常 java.lang.NoSuchFieldException //方法不存在异常 java.lang.NoSuchMethodException //空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常 java.lang.NullPointerException //数字格式异常 java.lang.NumberFormatException //运行时异常 java.lang.RuntimeException //安全异常 java.lang.SecurityException //字符串索引越界异常 java.lang.StringIndexOutOfBoundsException //类型不存在异常 java.lang.TypeNotPresentException //不支持的方法异常 java.lang.UnsupportedOperationException //Jsp页面异常 javax.servlet.jsp.JspException //JSP引擎解析异常 org.apache.jasper.JasperException //Servlet异常 javax.servlet.ServletException //对象已被删除异常 org.hibernate.ObjectDeletedException
4.2、throw..throws
package com.zhangguo.chapter6.d1; public class Exception2 { public static void main(String[] args) { try { System.out.println(div(30,3)); } catch (Exception e) { //输出异常的堆栈信息 e.printStackTrace(); } try { System.out.println(div(3,0)); } catch (Exception e) { System.out.println(e.getMessage()); } } //throws 声明方法将可能抛出异常 public static int div(int n1,int n2) throws Exception{ if(n2==0){ //抛出异常 throw new Exception("除数不能为零"); } return n1/n2; } }
运行结果:
五、掌握自定义异常
public class ArithmeticException extends RuntimeException { private static final long serialVersionUID = 2256477558314496007L; /** * Constructs an {@code ArithmeticException} with no detail * message. */ public ArithmeticException() { super(); } /** * Constructs an {@code ArithmeticException} with the specified * detail message. * * @param s the detail message. */ public ArithmeticException(String s) { super(s); } }