异常处理

  • java异常处理机制中的try-catch

     System.out.println("程序开始了...");
     try {
         String line = "a";
         System.out.println(line.length());
         System.out.println(line.charAt(0));
         System.out.println(Integer.parseInt(line));
         //try语句块中报错语句以后的内容都不会执行
         System.out.println("!!!!!!!!!!");
     }catch(NullPointerException e){//try中代码不出错,catch不执行
         System.out.println("出现了空指针!");
     }catch(StringIndexOutOfBoundsException e){//catch可以写多个
         System.out.println("出现了下标越界!");
     
         **catch如果捕获的是一个超类型的异常时,那么try中出现它的类型
         异常时都可以用这个catch进行捕获。通常以下情况我们会这样:
         1:多种异常使用同一种解决手段时,可以捕获这些类异常的超类。
         2:最终捕获Exception可以避免因为一个未捕获的异常导致程序中断
         多个catch的异常若存在继承关系,一定先捕获子类型异常,再捕获
         超类型异常。否则编译不通过。**
    
     }catch(Exception e){
         System.out.println("反正就是出了个错!");
     }
     System.out.println("程序结束了!");*/
    

子类重写父类含有的throws声明异常抛出的方法时对throws的几种特殊的重写规则

public void dosome()throws IOException{} :允许子类方法抛出部分异常

public void dosome(){} :可以不再抛出任何异常

public void dosome()throws FileNotFoundException{} :可以抛出超类方法抛出异常的子类异常

public void dosome()throws SQLException{}:不允许抛出额外异常

public void dosome()throws Exception{}:不允许抛出超类方法抛出异常的超类

当我们调用一个含有throws声明抛出异常的方法时,编译器要求必须处理这个异常,处理的方式有两种
1:使用try-catch捕获异常
2:在当前方法上继续使用throws声明这个异常的抛出具体选择哪种取决于异常责任的问题

自定义异常:通常当描述一个满足语法但不满足业务情况的错误时我们会使用到自定义异常
自定义异常要做如下几件事:

  • 1:类名定义时要做到见名知意
  • 2:需要继承自Exception,直接或间接继承
  • 3:提供Exception中提供的所有构造
 System.out.println("程序开始了....");
    String str = "a";
    try {
        System.out.println(Integer.parseInt(str));
    }catch (Exception e){
        //向控制台输出错误信息,便于debug
        e.printStackTrace();
        //获取异常消息,通常用来给用户提示
        System.out.println(e.getMessage());
    }

    System.out.println("程序结束了....");

//getCause-获取该异常出现的原因

Throwable是所有异常的父类
Exception和Error是其派生的两个子类
Exception:表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常。
Erro:表示java运行时环境出现的错误,是不能靠程序处理的
throw:自行抛出异常,并生成指定的异常对象
throws:捕获异常,声明这个方法将抛出会异常

java异常分为可检测异常,非检测异常
可检测异常:编译器会验证,如发生编译错误,编译器则强制处理异常或声明规则,不捕获这个异常,编译器就不通过,不允许编译。

非检测异常:不遵循处理或者声明规则,在 产生异常时,编译器不会检查是否已经解决了这一个异常

RuntimeException:属于非检测异常
常见的运行时异常:
1.NullPointerException:空指针异常
原因:当调用的变量为null时,则抛出该异常

2.ArrayIndexOutOfBoundsException:数组下标越界异常
原因:当使用的数组下标超出数组允许的范围时,抛出该异常

3.ClassCastException:强制类型转换异常
原因:当试图将对象强制转换为不是实例的子类是,抛出该异常

4.IllegalArgumentException:非法参数异常
原因:当传入一个不合法的参数时,抛出该异常

5.NumberFormatException:数字格式异常
原因:当应用程序将字符串转化为数据类型时,但该字符串不能转换为适当格式时,抛出该异常

其他异常:
1.StringIndexOutOfBoundsException:字符串索引超边异常
原因:当指定的位置超出字符串的长度时,发生该异常

2.OutOfMemoryError:内存溢出
原因:当程序频繁的修改字符串,造成许多的“垃圾”GC没有来的急回收,导致内存溢出抛出该异常

3.UnsupportedEncodingException:不支持的编码格式异常
原因:当编码格式书写错误时,抛出该异常

4.FileNotFoundException:系统找不到指定的文件
原因:当流对文件进行操作时,计算机没有该文件,抛出该异常

请分别说明final,finally,finalize?

final:最终的、不可改变的-----单独应用率极低
1)修饰变量:变量不能被改变
2)修饰方法:方法不能被重写
3)修饰类:类不能被继承

finally:是异常处理机制的最后一块,它可以直接跟在try后面(这样用较少)或最后一个catch之后。
finally可以保证只要程序执行到try当中,无论try里面的语句是否抛出异常,
finally中的代码都必定执行。
通常我们将释放资源这类操作放到finally中,比如IO操作后的关闭。

finalize:方法是对象Object定义的方法,所以java中所有的类都有这个方法,该方法是当GC释放一个对象前调用的方法,意味着该方法调用完毕这个对象就会给GC释放.如果需要重写这个方法,方法中不应当有耗时操作

throw 和 throws 的区别?
throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用,就交给谁处理。而throw则是指抛出的一个具体的异常类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值