Java核心(异常处理-异常 )

一、异常概述

    在程序中,错误可能产生于程序员没有预料到的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据、试图打开一个根本不存在的文件等。在 Java 中这种在程序运行时可能出现的一些错误称为异常。异常是一个程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。

    eg : 在项目中创建类 Baulk ,在主方法中定义 int 型变量,将 0 作为除数赋值给该变量。

public class Baulk{        //创建类
    public static void main(Stirng[] args){        //主方法
        int result = 3/0;        //定义 int 型变量并赋值
        System.out.println(result);        //将变量输出
    }
}

    运行结果为 :

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.myException.myBua.main(myBua.java:7)

    程序运行的结果报告发生了算数异常 ArithmeticException(根据给出的错误提示可知发生错误是因为在算数表达式“ 3/0 ”中 ,0 作为除数出现),系统不再执行下去,提前结束。这种情况就是所说的异常。

    有许多异常的例子,如空指针,数据溢出等。Java 语言是一门面向对象的编程语言,因此,异常在 Java 语言中也是作为类的实例的形式出现的。当某一方法中发生错误时,这个方法会创建一个对象,并且把它传递给正在运行的系统。这个对象就是异常对象。通过异常处理机制,可以将非正常情况下的处理代码与程序的主逻辑分离,即在编写代码主流程的同时在其他地方处理异常。

二、处理程序异常错误

    为了保证程序有效地执行,需要对发生的异常进行相应的处理。在 Java 中,如果某个方法抛出异常,即可以在当前方法中进行捕捉,然后处理该异常,也可以将异常向上抛出,由方法调用者来处理。

    2.1 错误

      异常产生后,如果不做任何处理,程序就会被终止。例如,将一个字符串转换为整形,可以通过 Integer 类的 parseInt() 方法来实现。但如果该字符串不是数字形式, parseInt() 方法就会抛出异常,程序就在出现异常的位置终止,不在执行下面的语句。

    eg : 在项目中创建类 Thundering ,在主方法中实现将非字符型数值转换为 int 型。运行程序,系统会报出异常提示。

public class Thundering {        //创建类
    public static void main(String[] args) {        //主方法
        String string = "lili";        //定义字符串
        System.out.println(string+"年龄是:");        //输出的提示信息
        int age = Integer.parseInt("20L");        //数据类型的转换
        System.out.println(age);        //输出信息
    }
}

    运行结果为:

lili年龄是:
Exception in thread "main" java.lang.NumberFormatException: For input string: "20L"
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at com.myException.Thundering.main(Thundering.java:7)

    报出 NumberFormatException (字符串转换为数字)异常。提示信息“ lili年龄是: ”已经输出,可知该句代码之前并没有异常,而变量 age 没有输出,可知程序在执行类型转换代码已经终止。

    2.2  捕捉异常

    Java 语言的异常捕获结构由  try、catch 和 finally 3 部分组成。其中, try 语句块存放的是可能发生异常的 Java 语句; catch 程序块在 try 语句块之后,用来激发被捕获的异常; finally 语句块是异常处理结构的最后执行部分,无论 try 块中的代码如何退出,都将执行 finally 块。

    语法:

try{
    ...        //程序代码块
}
catch(Exceptiontype1 e){
    ...        //对 Exceptiontype1  的处理
}
catch(Exceptiontype2 e){
    ...        //对 Exceptiontype2  的处理
}
......
finally{
    ...        //程序块
}

    通过异常处理的语法可知,异常处理器大致分为 try - catch 语句块和 finally 块。

    2.2.1  try - catch 语句块

    eg : 在项目中创建类 Take ,在主方法中使用 try - catch 语句块将可能出现的异常语句进行异常处理。

public class Take {
    public static void main(String[] args) {
        try {        //try 语句中包含可能出现异常的程序代码
            String string = "lili";        //定义字符串
            System.out.println(string + "年龄是:");        //输出的提示信息
            int age = Integer.parseInt("20L");        //数据类型的转换
            System.out.println(age);        //输出信息
        } catch (Exception e) {        //catch 语句块用来获取异常信息
            e.printStackTrace();        //输出异常性质
        }
        System.out.println("program over");        //输出信息
    }
}

    运行结果为:

lili年龄是:
java.lang.NumberFormatException: For input string: "20L"
program over
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at com.myException.Take.main(Take.java:8)

   程序仍然输出最后的提示信息,没有因为异常而终止。将可能出现异常的代码用 try - catch 语句块进行处理,当 try 代码块中的语句发生异常时,程序就会调转到 catch 代码块中执行,执行完成 catch 语句块中的程序代码后,将继续执行 catch 代码块后的其他代码,而不会执行 try 代码块中发生异常语句后面的代码。由此可知, Java 的异常处理时结构化的,不会因为一个异常影响整个程序的执行。

    Exception 是 try 代码块传递给 catch 代码块的变量类型, e 是变量名。 catch 代码块中语句 “ e.printStackTrace(); ”用于输出错误性质。通常,异常处理常用以下 3 个函数来获取异常的有关信息。

    ( 1 ) : getMessage() 函数 :输出错误性质。

    ( 2 ) : toString() 函数 :给出异常的类型与性质。

    ( 3 ) : printStackTrace() 函数 :支出异常的类型、性质、栈层次及出现在程序中的位置。 

    有时为了编程简单会忽略 catch 语句后的代码,这样 try - catch 语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找。因此养成良好的编码习惯,最好在 catch 代码块中写入处理异常的代码。

    2.2.2  finalyy 语句块

    完整的异常处理语句一定要包含 finalyy 语句,无论程序中有误异常发生,并且无论之间的 try - catch 是否顺利执行完毕,都会执行 finally 语句。

     在以下 4 中特殊情况下, finally 语句块不会被执行:

    ( 1 ) :在 finally 语句块中发生了异常。

    ( 2 ) :在前面的代码中使用了 System.exit() 退出程序。

    ( 3 ) :程序所在的线程死亡。

    ( 4 ) :关闭 CPU。



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页