bat读⽂件时如何捕获异常_[基础篇]-异常-01-异常处理机制异常处理机制
Java的异常机制能让程序具有良好的容错性,让程序更加健壮,当程序出现意外的情况,系统会⾃动⽣成⼀个Exception对象通知程序进程处理,从⽽实现业务功能和实现代码的分离。
1.异常的继承体现
2.使⽤try-catch捕获异常
Try试图捕获异常。{ }内是捕获异常的范围
Catch是捕获到异常以后如何处理 其中catch代码块可以出现多次。
public class ExceptionDemo {
public static void main(String[] args) {
/**
* 使⽤atch语句捕获异常
*/
try
{
//  System.out.println(9/0);
//  Class.forName("java.util.ArrayListhahah");
FileInputStream fis = new FileInputStream("c:/");
}catch (ArithmeticException e) {
System.out.println("捕获到了数学运算异常的错误...");
} catch (FileNotFoundException e) {
System.out.println("捕获到了⽂件不存在的异常...");
} catch (Exception e) {
System.out.println("捕获到了未知的异常...");
}
}
}
3.Java7提供了多异常的捕获
在jdk1.7之前,每个catch只能捕获⼀种类型的异常,但是从java7以后⼀个catch可以捕获多个异常。使⽤⼀个catch捕获多个异常需要注意以下情况:
捕获多个异常,多种异常之间⽤ | 分割
捕获多种类型的异常时,异常变量有隐式的final修饰,所以程序不能对异常变量重新赋值。
public class MultiExceptionDemo {
public static void main(String[] args) {
try {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = a / b;
System.out.println("当前执⾏的结果c是:" + c);
/**
* ⼀次性捕获多个异常需⽤ |隔开
*/
} catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException e) {
System.out.println("捕获到了数组越界,数字格式异常,算数异常等之⼀的错误...");
/**
* 多异常捕获的变量是默认被final修饰的所以下⽅的代码报错...
* e=new ArithmeticException("aa");
* 不能够对final修饰的变量进⾏⼆次修改赋值
*/
} catch (Exception e) { //最⼤的异常始终是放在最后⼀个捕获
System.out.println("捕获到了未知的异常...");
e=new RuntimeException("aaa");
}
}
}
4.访问异常信息
public class AccessExceptionDemo {
/**
* 通过相关的⽅法了解具体捕获到的异常信息
*/
public static void main(String[] args) {
try
{
FileInputStream fis = new FileInputStream("c://a.txt");
}catch(IOException e)
{
System.out.Class());
System.out.Message());
System.out.StackTrace());
//了解具体的异常信息
e.printStackTrace();unknown怎么处理
}
}
/**
* 结果显⽰:
* class java.io.FileNotFoundException
* (系统不到指定的⽂件。)
* [Ljava.lang.StackTraceElement;@6d06d69c
* java.io.FileNotFoundException: (系统不到指定的⽂件。)
* at java.io.FileInputStream.open0(Native Method)
* at java.io.FileInputStream.open(Unknown Source)
* at java.io.FileInputStream.<init>(Unknown Source)
* at java.io.FileInputStream.<init>(Unknown Source)
* at ption.base.AccessExceptionDemo.main(AccessExceptionDemo.java:13)
*/
}
5.使⽤finally 回收资源
有些时候 程序中在try代码块⾥ 打开了⼀些物理资源(数据库的连接,⽹络连接,磁盘⽂件)等 最终要把这些资源进⾏回收,提⾼系统的运⾏能⼒。
垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(⽐如数据库连接,⽹络,IO等)
public class FilallyDemo {
public static void main(String[] args) {
FileInputStream fis = null;
try
{
fis = new FileInputStream("");
}catch(IOException e)
{
System.out.Message());
}finally{//finally语句块是⽆论如何都会执⾏的语句块
if(fis!=null)
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("finally代码块执⾏...");
}
}
}
public class FinallyCommonView {
public static void main(String[] args) {
int a=test();
System.out.println(a);
}
public static int test() {
int i=0;
try {
System.out.println(9 / 0);
return i=i+100;
} catch (Exception e) {
System.out.println("捕获到了异常..");
//这⾥的return是执⾏的但是并没有结束整个⽅法代码继续往下执⾏
return i=i+3;
}finally {
System.out.println("⽆论如何都会执⾏的代码...");
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块中有it(0);这样的语句。it(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后⾯的值复制了⼀份到返回值变量⾥去了。如果atch…finally…三个语句之内没有return语句,则其会调⽤这三个语句块之外的return语句执⾏!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。