java异常机制和File类
Error类用于描述java虚拟机无法解决的严重错误,通常无法编码解决。如:JVM垮掉了
Exception用于描述因编程错误或者偶然外在因素导致的轻微错误,通常可以通过编码解决。如0作为除数
异常分类
java.lang.Exception是所有异常的超类,分为以下2种
- RuntimeException 运行时异常 也叫非检测性异常
- IoException和其他异常称为其他异常 也叫检测性异常(编译器在编译阶段能够检测出来)
对于Error我们无能为力,主要解决对Execption的处理
检测异常和非检测异常
常见异常
异常的处理
程序出现异常后,如果程序员没有进行处理将由JVM按照默认的方式进行处理并结束程序的执行
package com.cn.hello;
import java.io.IOException;
public class Animal {
public static void main(String[] args) {
int a=4;
int b=0;
System.out.println(a/b);//算术异常
int c[]=new int[3];
int d=3;
System.out.println(c[d]);//数组下标越界异常
String str=null;
System.out.println(str.length());//空指针异常
Exception ex=new Exception();
IOException IO=(IOException) ex;//类的类型转换异常
String str1="hdhh123";
int m=Integer.parseInt(str1);//数字格式异常
System.out.println("程序执行完毕");
}
}
当出现异常时程序会终止执行,以上的程序会报出算术异常,之后的程序将不会再执行
用if判断进行程序异常的避免
那个类转换异常的阻止类可以使用,程序会先进行类的加载
package com.cn.hello;
import java.io.IOException;
public class Animal {
public static void main(String[] args) {
int a=4;
int b=0;
if(b!=0) {
System.out.println(a / b);//算术异常
}
int c[]=new int[3];
int d=3;
if(d>=0&&d<3) {
System.out.println(c[d]);//数组下标越界异常
}
String str=null;
if(str!=null) {
System.out.println(str.length());//空指针异常
}
Exception ex=new Exception();
if(ex instanceof IOException) {
IOException IO = (IOException) ex;//类的类型转换异常
}
String str1="hdhh123";
if(str1.matches("\\d+")) {
int m = Integer.parseInt(str1);//数字格式异常
}
System.out.println("程序执行完毕");
}
}
output:程序执行完毕
用if判断成功阻止了程序的中断
但用if判断会加长代码, 可读性差
当程序出现异常后直奔catch分支进行处理
手动处理异常和没有处理异常的区别在于代码是否向下执行
虽然用Execption类可以接收所有的异常的对象,但这样写影响代码的可读性,在开发中推荐用try cath 的接连组合进行对象的接收
Exception类接收的异常,要放在最后
Fanally的使用
finally里面 面向无论是否发生异常都要执行的代码
当出现当有一些意想不到的异常没有被捕获,然后交由JVM进行处理,导致程序终止执行,Finally里面的代码此时还可以执行
举例:
package com.cn.hello;
import java.io.IOException;
public class Animal {
public static void main(String[] args) {
int a=5;
int b=0;
try {
System.out.println(a / b);
}catch (ArithmeticException e){//进行算术异常的处理
e.printStackTrace();
System.out.println("我捕获了异常哦");
String str=null;
str.length();
}
finally {
System.out.println("我还可以执行哦");
}
System.out.println("程序截至");
}
}
output:
java.lang.ArithmeticException: / by zero
at com.cn.hello.Animal.main(Animal.java:8)
Exception in thread "main" java.lang.NullPointerException
at com.cn.hello.Animal.main(Animal.java:13)
我捕获了异常哦
我还可以执行哦
finally通常用于善后 如文件的关闭
finally的笔试----可能存在改变方法返回值的问题
package com.cn.hello;
import java.io.IOException;
public class Animal {
public static int test(){
int a=4;
int b=0;
try{
System.out.println(a/b);//该步异常跳转到catch处理 return 0不执行
return 0;
}catch (ArithmeticException e){
e.printStackTrace();//该步执行完后 有finally必须让其语句最后执行
return 1;//return 2执行后程序截至,该句没有执行
}
finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(Animal.test());//输出2
}
}
方法异常的抛出
当在某些情况下有些异常不能处理或者不便处理时,就可以将该异常转移给该方法的调用者,这种方式就叫异常的抛出
底层是生成了一个异常类的对象然后抛出
package com.cn.hello;
import java.io.FileInputStream;
import java.io.IOException;
public class Animal {
public static void show()throws IOException{//此时利用多态有IoException接收2个子异常
FileInputStream fis=new FileInputStream("d:/a.txt");
System.out.println("hello");
fis.close();
}
public static void main(String[] args)/*此时可以在main方法中继续抛出但不建议throws IOException*/ {
try {
show();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("world");
}
}
java.io.FileNotFoundException: d:\a.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
world
子类重写父类抛出异常分析
异常可以抛出也可以捕获,开发种怎样处理?
第二种方式举例
自定义异常的抛出