黑马程序员技术交流社区

标题: 【Java基础交流】之【一张贴搞定异常】!! [打印本页]

作者: 传奇查    时间: 2015-11-18 16:52
标题: 【Java基础交流】之【一张贴搞定异常】!!
本帖最后由 传奇查 于 2015-11-18 17:10 编辑

对你有用就给个鼓励奖吧~

异常的概述:
  1. package cn.fuxi.exception;
  2. /**
  3. * 异常的体系
  4. * 异常:是在运行时期发生的不正常情况.
  5. * 在java中用类的形式对不正常情况经行了描述和封装对象.描述不正常的情况的类,就称为异常类.
  6. * 1.以前是正常流程代码和问题处理代码相结合,现在将正常流程代码和问题处理代码分离,提高阅读性.
  7. * 2.其实异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述.
  8. * 3.不同的问题用不同的类进行具体的描述.比如角标越界...空指针异常等等.
  9. * 4.问题很多,意味着描述的类很多,将其共性经行向上抽取,形成了异常体系.
  10. *
  11. * 不正常情况分成了两大类:
  12. * Throwable:无论是error,还是异常问题,发生就可以抛出,让调用者知道并处理.
  13. * 该体系的特点就再在于Throwable及其所有的子类都具有可抛性.
  14. *
  15. * 可抛性到底指的是什么?怎么体现?
  16. * 其实是通过两个关键字来体现的:throws throw
  17. * 凡是可以被这两个关键字所操作的类和对象都具备可抛性.
  18. *
  19. * 1.一般不可处理的:Error
  20. * 特点:是由jvm抛出符严重性问题.
  21. * 这种问题发生,一般不针对性处理,直接修改程序.
  22. * 2.可以处理的:Exception
  23. * 该体系的特点:
  24. * 子类的后缀名都是用其父类名作为后缀,阅读性很强.
  25. *
  26. * Throwable中的方法:
  27. * 1.getMessage():获取异常信息,返回字符串.
  28. * 2.toString():获取异常类名和异常信息,返回字符串.
  29. * 3.printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void.
  30. * 4.printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查询.
  31. */
  32. class Demo{
  33.         public static int method(int[] arr,int index){
  34.                 if(arr==null){
  35.                         throw new NullPointerException("数组的引用不能为空!");
  36.                 }
  37.                 if(index >=arr.length){
  38.                         throw new ArrayIndexOutOfBoundsException("数组角标越界:"+index);
  39.                 }
  40.                 return arr[index];
  41.         }
  42. }

  43. public class ExceptionDemo {
  44.         public static void main(String[] args) {
  45.                 int[] arr = new int[3];
  46.                 Demo.method(arr, 30);
  47.         }

  48. }
复制代码
运行结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 数组角标越界:30
at cn.fuxi.exception.Demo.method(ExceptionDemo.java:38)
at cn.fuxi.exception.ExceptionDemo.main(ExceptionDemo.java:47)


自定义异常
  1. package cn.fuxi.exception;
  2. /**
  3. * 自定义异常
  4. * 可以自定义出的异常为自定义异常.
  5. * 对于角标为负数的情况,可以用负数角标异常来表示,负数角标这种异常在java中并没有定义过.
  6. * 那就按照java异常的创建思想,面向对象,将负数角标经行自定义描述,并封装成对象.
  7. * 这种自定义的问题描述称为自定义异常.
  8. *
  9. * P.S.如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性,
  10. * 才可以被两个关键字所操作:throws throw.
  11. *
  12. * 自定义类继承Exception或者其子类,通过构造函数定义异常信息
  13. */
  14. class DemoException extends Exception{
  15.         DemoException(String message){
  16.                 super(message);
  17.         }
  18. }
  19. /*
  20. *通过throw将自定义异常抛出.
  21. *throws和throw的区别
  22. *1.throws用于标识函数暴露出来的异常类,并且可以抛出多个,用逗号分隔.throw用于抛出异常对象.
  23. *2.throws用在函数上,后面跟异常类名.throws用在函数内,后面跟异常对象.
  24. *
  25. * 定义功能方法时,需要把出现的问题暴露出来让调用者去处理,那么久通过throws在函数上标识.
  26. */

  27. class FuShuIndexException extends Exception{
  28.         FuShuIndexException(){}
  29.         FuShuIndexException(String msg){
  30.                 super(msg);
  31.         }
  32. }
  33. class Demo2{
  34.         public static int method(int[] arr,int index) throws FuShuIndexException {
  35.                 if(index<0){
  36.                         throw new FuShuIndexException("数组的角标是负数");
  37.                 }
  38.                 return arr[index];
  39.         }
  40. }
  41. public class ExceptionDemo2 {

  42.         public static void main(String[] args) throws FuShuIndexException {
  43.                 int[] arr = new int[5];
  44.                 Demo2.method(arr, -6);

  45.         }
  46. }
复制代码
运行结果:
Exception in thread "main" cn.fuxi.exception.FuShuIndexException: 数组的角标是负数
at cn.fuxi.exception.Demo2.method(ExceptionDemo2.java:37)
at cn.fuxi.exception.ExceptionDemo2.main(ExceptionDemo2.java:46)

异常的分类:
  1. package cn.fuxi.exception;
  2. /**
  3. * 异常的分类:
  4. * 1.编译时被检测异常:只要是Exception和其子类都是,初二了特殊子类RuntimeExc体系.
  5. * 这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式.
  6. * 这样的问题都可以针对性的处理.
  7. *
  8. * 2.编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类.
  9. * 这种问题的发生,无法让功能继续,运算无法运行,更多是因为调用的原因导致的或者引发了内
  10. * 部状态的改变导致的.
  11. * 那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者
  12. * 对对代码经行调整.
  13. * 所以自定义异常时,要么继承Exception,要么继承RuntimeException.
  14. */
  15. class FuShuIndexException2 extends RuntimeException{
  16.         FuShuIndexException2(){}
  17.                 FuShuIndexException2(String msg){
  18.                         super(msg);
  19.                 }        
  20. }
  21. class Demo3{
  22.         public static int method(int[] arr,int index){//RuntimeException 不需要用throws抛出
  23.                 if(index < 0){
  24.                         throw new FuShuIndexException2("数组的角标是负数啦!");
  25.                 }
  26.                 return arr[index];        
  27.         }
  28. }
  29. public class ExceptionDemo3 {

  30.         public static void main(String[] args) {
  31.                 int[] arr = new int[5];
  32.                 Demo3.method(arr, -9);
  33.         }
  34. }
  35. /*
  36. *P.S.RuntimeException是那些可能在java虚拟机正常运行期抛出的异常的超类.
  37. *可能在执行方法期间抛出当未被捕获的RuntimeException的任何子类都无需再throws子句中进行声明.
  38. */
复制代码
运行结果:
Exception in thread "main" cn.fuxi.exception.FuShuIndexException2: 数组的角标是负数啦!
at cn.fuxi.exception.Demo3.method(ExceptionDemo3.java:24)
at cn.fuxi.exception.ExceptionDemo3.main(ExceptionDemo3.java:33)

发现一张贴写不完啦~好吧!我错了!!异常的捕捉、处理、案列---->后续请看↓

【Java基础交流】之【一张贴搞定异常2】
http://bbs.itheima.com/thread-261393-1-1.html
(出处: 黑马程序员IT技术论坛)

对你有用就给个鼓励奖吧~~

作者: fslichen    时间: 2015-11-19 13:02
cool,nice one
作者: wx_YXxWrUwd    时间: 2015-11-19 13:05
不错 收藏下
作者: 切比雪夫    时间: 2015-11-19 21:38
谢谢分享!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2