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.
* at putStream.
* 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后面的值复制了一份到返回值变量里去了。如果


发布评论