1.什么是异常
在java中针对问题的反馈以及处理的一套机制。
2.具体介绍
异常分两种:
Exception:是一个合理的应用程序,出现之后可以处理也可以不处理。jvm发生,并告诉使用者。可以进行针对性处理
Error:是一个合理(符合语法且代码执行逻辑没有问题)的应用程序,由系统底层发生的,告诉jvm,jvm告诉使用者问题严重,如果一旦发生,不做针对性处理的解决途径只有一个:修改代码 不如内存溢出
它两的父类:Throwable:定义了对于问题的共性的功能。所有问题异常的超类
3.Exception分类
1.运行时异常----编译没错,运行有错 可以处理也可以不处理 总的运行时异常父类是 RuntimeException
2.编译时异常---编译有错,一定要处理(抛出或者捕获)
4.自定义异常
public class ExceptionDemo2 { public static void main(String[] args) { //读取文件内容 //方法抛出的异常,方法的调用者需要进行异常的处理 //try块---存放可能会出错的代码 //如果try块出错了就用catch块进行捕获处理 //try-catch一定会直接结束,执行下一个语句 //方法上抛出了几个编译时异常就处理几个编译时异常 try { String s=readTxt(null);//要读取的是.txt //捕获的是异常类的对象 } catch (PathNotExitsExption e) {//new PathNotExitsExption() // TODO Auto-generated catch block //处理异常 System.out.println(e.getMessage()); }catch(FileNotExitsException e){ //处理异常 System.out.println(e.getMessage());//父类属性 }catch(NullPointerException e){ //打印异常的栈轨迹 e.printStackTrace(); } //读取完成 //当异常捕获之后后面的代码正常执行 System.out.println("读取文件完毕。。"); } //方法上抛出异常---可以抛出多个异常 //方法上必须抛出的异常时编译时异常 public static String readTxt(String path) throws PathNotExitsExption, FileNotExitsException,NullPointerException{ //判断参数是否为null if(path==null){ //反馈问题 //可以处理也可以不处理 throw new NullPointerException("亲,参数为null..."); } //可能文件类型不对 //对文件类型进行判断 if(!path.endsWith(".txt")){//不是txt的文件类型都会进来 //反馈问题 throw new FileNotExitsException("亲,文件类型有问题..."); } //可能会出现文件所在路径不存在 //对路径进行判断 if(path.startsWith("H")){//如果以H盘符开头就不存在 //问题的反馈 //抛出异常---后面所有代码都不执行 ----抛出一个异常类对象 throw new PathNotExitsExption("亲,你的路径有问题..."); } //开始读取文件内容.. return "文件的内容"; } } //自定义异常类 继承异常类 //如果不继承RuntimeException就是编译时异常 class PathNotExitsExption extends Exception{ //属性 private String message; //有参构造 public PathNotExitsExption(String message) { // TODO Auto-generated constructor stub this.message=message; } // public String getMessage(){ return message; } } //自定义异常类 class FileNotExitsException extends Exception{ // public FileNotExitsException(String message) { // TODO Auto-generated constructor stub super(message);//调用父类有参构造,给父类属性赋值 } }
5 throw和throws
6.捕获的方式
1.所有捕获异常可以用他们的公共父类来处理
try { String s=readTxt(null);//要读取的是.txt //捕获的是异常类的对象 } catch (Exception e) {//可以统一处理捕获的不同异常 // TODO Auto-generated catch block //处理异常 System.out.println(e.getMessage()); }
2.抛出的所有异常进行单独处理,在catch块中进行单独的捕获与处理
try { String s=readTxt(null);//要读取的是.txt //捕获的是异常类的对象 } catch (PathNotExitsExption e) {//new PathNotExitsExption() // TODO Auto-generated catch block //处理异常 System.out.println(e.getMessage()); }catch(FileNotExitsException e){ //处理异常 System.out.println(e.getMessage());//父类属性 }catch(NullPointerException e){ //打印异常的栈轨迹 e.printStackTrace(); }
3.在jdk1.7以后有个分组的概念,可以按照分组来处理各组的异常
try { String s=readTxt(null);//要读取的是.txt //捕获的是异常类的对象 } catch (PathNotExitsExption |FileNotExitsException |NullPointerException e) {//new PathNotExitsExption() // TODO Auto-generated catch block //处理异常 System.out.println(e.getMessage()); }
抛出的异常希望进行分组处理,jdk1.7提供分组捕获,一组之间的异常通过在catch之间用|连接
7.异常捕获后的异常信息显示
8.父类的异常捕捉要放到子类的最后面,这就相当于捕获到剩下没有捕获的异常
try { String s=readTxt(null);//要读取的是.txt //捕获的是异常类的对象 } catch (PathNotExitsExption e) {//new PathNotExitsExption() // TODO Auto-generated catch block //处理异常 System.out.println(e.getMessage()); }catch(FileNotExitsException e){ //处理异常 System.out.println(e.getMessage());//父类属性 }catch(NullPointerException e){ //打印异常的栈轨迹 e.printStackTrace(); } catch (Exception e) { System.out.println("放最后没错,放前面会报错"); }
9.finally块无论代码有没有出现异常,finally块里面的代码都是要执行的