2023年12月8日发(作者:)

bat读文件时如何捕获异常_[基础篇]-异常-01-异常处理机制

异常处理机制

Java的异常机制能让程序具有良好的容错性,让程序更加健壮,当程序出现意外的情况,系统会自动生成一个Exception对象通知程序进程

处理,从而实现业务功能和实现代码的分离。

1.异常的继承体现

2.使用try-catch捕获异常

Try试图捕获异常。{ }内是捕获异常的范围

Catch是捕获到异常以后如何处理 其中catch代码块可以出现多次。

public class ExceptionDemo {

public static void main(String[] args) {

/**

* 使用atch语句捕获异常

*/

try

{

// n(9/0);

// e("isthahah");

FileInputStream fis = new FileInputStream("c:/");

}catch (ArithmeticException e) {

n("捕获到了数学运算异常的错误...");

} catch (FileNotFoundException e) {

n("捕获到了文件不存在的异常...");

} catch (Exception e) {

n("捕获到了未知的异常...");

}

}

}

7提供了多异常的捕获

在jdk1.7之前,每个catch只能捕获一种类型的异常,但是从java7以后一个catch可以捕获多个异常。使用一个catch捕获多个异常需要注

意以下情况:

捕获多个异常,多种异常之间用 | 分割

捕获多种类型的异常时,异常变量有隐式的final修饰,所以程序不能对异常变量重新赋值。

public class MultiExceptionDemo {

public static void main(String[] args) {

try {

int a = nt(args[0]);

int b = nt(args[1]);

int c = a / b;

n("当前执行的结果c是:" + c);

/**

* 一次性捕获多个异常需用 |隔开

*/

} catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException e) {

n("捕获到了数组越界,数字格式异常,算数异常 等之一的错误...");

/**

* 多异常捕获的变量是默认被final修饰的 所以下方的代码报错...

* e=new ArithmeticException("aa");

* 不能够对final修饰的变量进行二次修改赋值

*/

} catch (Exception e) { //最大的异常始终是放在最后一个捕获

n("捕获到了未知的异常...");

e=new RuntimeException("aaa");

}

}

}

4.访问异常信息

public class AccessExceptionDemo {

/**

* 通过相关的方法了解具体捕获到的异常信息

*/

public static void main(String[] args) {

try

{

FileInputStream fis = new FileInputStream("c://");

}catch(IOException e)

{

n(ss());

n(sage());

n(ckTrace());

//了解具体的异常信息

tackTrace();

}

}

/**

* 结果显示:

* class tFoundException

* c: (系统找不到指定的文件。)

* [raceElement;@6d06d69c

* tFoundException: c: (系统找不到指定的文件。)

* at 0(Native Method)

* at (Unknown Source)

* at putStream.(Unknown Source)

* at putStream.(Unknown Source)

* at (:13)

*/

}

5.使用finally 回收资源

有些时候 程序中在try代码块里 打开了一些物理资源(数据库的连接,网络连接,磁盘文件)等 最终要把这些资源进行回收,提高系统的运行

能力。

垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(比如数据库连接,网络,IO等)

public class FilallyDemo {

public static void main(String[] args) {

FileInputStream fis = null;

try

{

fis = new FileInputStream("c:");

}catch(IOException e)

{

n(sage());

}finally{//finally语句块是无论如何都会执行的语句块

if(fis!=null)

try {

();

} catch (IOException e) {

tackTrace();

}

n("finally代码块执行...");

}

}

}

public class FinallyCommonView {

public static void main(String[] args) {

int a=test();

n(a);

}

public static int test() {

int i=0;

try {

n(9 / 0);

return i=i+100;

} catch (Exception e) {

n("捕获到了异常..");

//这里的return是执行的 但是并没有结束整个方法 代码继续往下执行

return i=i+3;

}finally {

n("无论如何都会执行的代码...");

return i=i+6;

}

}

/**

* 结果分析:

* finally语句块是无论如何都会执行的语句块,因此在上述语句中,分为

* try、catch、finally三个部分,try中的return语句不会执行,

* catch中虽然执行了相应的return语句,但此时并没有结束整个方法,

* 而是继续往下执行,直到执行完filally语句块的内容,再执行return

* 语句结束整个方法因此最终结果输出为3+6=9

*/

}

以下两种情况finally语句块不会执行

try语句没有被执行到,如在try语句之前return就返回了,这样finally语句就不会执行。这也说明了finally语句被执行的必要而非充分

条件是:相应的try语句一定被执行到。

在try块|catch块中有(0);这样的语句。(0)是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当

然finally语句也不会被执行到。

在try-catch-finally中, 当return遇到finally,return对finally无效,即:

在try catch块里return的时候,finally也会被执行。

finally里的return语句会把try catch块里的return语句效果给覆盖掉。结论:return语句并不一定都是函数的出口,执行return时,只是把return后面的值复制了一份到返回值变量里去了。如果return语句并不一定都是函数的出口,执行return时,只是把return后面的值复制了一份到返回值变量里去了。如果