现在的位置: 首页 > 综合 > 正文

Java异常处理机制

2017年11月14日 ⁄ 综合 ⁄ 共 4274字 ⁄ 字号 评论关闭

一、什么是java异常

    异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通
过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。

二、Throwable的子类

 1、Error(错误):是程序无法处理的错误
表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时
JVM(Java 虚拟机)出现的问题。例如,
Java虚拟机运行错误(Virtual MachineError),
JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual
MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。


2、
exception(异常):是程序本身可以处理的错误。

RuntimeException在程序运行期间发生的异常,常见有:NullPointerException空指针异常,ArithmeticException算法异常,ArrayIndexOutOfBoundException数组越界
I
legalargumentExption非法参数异常

三、checkException可查异常和uncheckException不可查异常 
  

对于可查异常,编译器已经替我们做了,它在程序编辑的时候发现异常,并要求我们处理该异常。
不可查异常是在程序运行时出现,这部分异常是我们必须要进行异常捕获的,

、处理异常机制

在java应用程序中,java异常处理机制分为:抛出异常,捕获异常。
抛出异常:throws Exception
是指我们把异常的对象处理交给运行时系统。异常对象包含了异常类型,异常错误信息和状态等。
捕获异常:try,catch和finally

try-catch-finally 规则(异常处理语句的语法规则):

1)
 必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。

2)
必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。

3)
catch 块与相应的异常类的类型相关。

4)
一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块

5)
可嵌套 try-catch-finally 结构。

6)
在 try-catch-finally 结构中,可重新抛出异常。

7)
除了下列情况,总将执行 finally 做为结束:
JVM
过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。

五、常见异常

1、runtimeException异常

   
1、 java.lang.ArrayIndexOutOfBoundsException
    数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
    2、java.lang.ArithmeticException
    算术条件异常。譬如:整数除零等。
    3、java.lang.NullPointerException
    空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
    4、java.lang.ClassNotFoundException
    找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

 
 5、java.lang.NegativeArraySizeException 
 数组长度为负异常

   6、java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常

   7、java.lang.SecurityException 安全性异常

   8、java.lang.IllegalArgumentException 非法参数异常

2、Io异常

IOException:操作输入流和输出流时可能出现的异常。

EOFException
  文件已结束异常

FileNotFoundException
  文件未找到异常

3、其它

ClassCastException
   类型转换异常类

ArrayStoreException
 数组中包含不兼容的值抛出的异常

SQLException
  操作数据库异常类

NoSuchFieldException
  字段未找到异常

NoSuchMethodException
  方法未找到抛出的异常

NumberFormatException
   字符串转换为数字抛出的异常

StringIndexOutOfBoundsException
字符串索引超出范围抛出的异常

IllegalAccessException
 不允许访问某类异常

InstantiationException
 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常

 
  

六、自定义异常

使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
    在程序中使用自定义异常类,大体可分为以下几个步骤。
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。

七、throw和throws关键字的区别

  throw用来抛出一个异常,在方法体内。语法格式为:throw 异常对象。

  throws用来声明方法可能会抛出什么异常,在方法名后,语法格式为:throws 异常类型1,异常类型2...异常类型n。

八、自定义异常捕获

public class CrashHandler implements UncaughtExceptionHandler {
    // CrashHandler实例
    private static CrashHandler instance;
    // 程序的Context对象
    private Context mContext;
    /** 保证只有一个CrashHandler实例 */
    private CrashHandler() {
    }
    /** 获取CrashHandler实例 ,单例模式 */
    public static CrashHandler getInstance() {
        if (instance == null)
            instance = new CrashHandler();
        return instance;
    }
    /**
     * 初始化
     */
    public void init(Context context) {
        mContext = context;
        // 设置该CrashHandler为程序的默认处理器
        Thread.setDefaultUncaughtExceptionHandler(this);
    }
    /**
     * 当UncaughtException发生时会转入该函数来处理
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        ex.printStackTrace();
        handleException();
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
        }
        // 保存统计数据
        MobclickAgent.onKillProcess(mContext);
        // 退出程序
        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(1);
        
    }
    /**
     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
     * @param ex
     */
    private void handleException() {
        // 使用Toast来显示异常信息
        new Thread() {
            @Override
            public void run() {
                Looper.prepare();
                Toast.makeText(mContext, "很抱歉,出现异常", Toast.LENGTH_SHORT).show();
                Looper.loop();
            }
        }.start();
    }  
}

抱歉!评论已关闭.