黑马程序员_异常、包

----------------------android培训java培训、期待与您交流! ----------------------

1.异常概述
异常:就是程序在运行时出现的不正常情况
异常也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象
其实就是java对不正常情况进行描述后的对象体现
对于严重的,java通过error类进行描述
   对于error一般不编写针对性的代码对其进行处理
对于非严重的,java语言通过exception类进行描述
   对于exception可以使用针对性的处理方式进行处理


2.异常体系



3.异常的处理

在方法上声明异常
便于提高安全性,让调用处进行处理,不处理编译失败
用try catch语句对异常进行处理

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. try  
  2.    {  
  3.     需要被检测的代码;  
  4.    }  
  5.    catch(异常类 变量)  
  6.    {  
  7.     处理异常的代码;(处理方式)  
  8.    }  
  9.    finally  
  10.    {  
  11.     一定会执行的语句;  
  12.    }  
例:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Test {  
  2.     public static void main(String[] args) {  
  3.         try {  
  4.             int a = divid(4,0);     //检测代码  
  5.         } catch (Exception e) {  
  6.             System.out.println("被除数为0");    //处理  
  7.         }  
  8.           
  9.     }  
  10.     public static int divid(int a, int b) throws Exception{//声明异常  
  11.         return a/b;  
  12.     }  
  13. }     

对多异常的处理
a.声明异常时,建议声明更为具体的异常,这样处理的可以更具体
b.对方声明几个异常,就对应有几个catch块,不要定义多余的catch块
  如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面
建议在进行catch处理时,catch中一定要定义具体处理方式,不要简单的定义一句e.printStackTrace()或输出语句


4.自定义异常
因为项目中会出现特有的问题
而这些问题并未被java所描述并封装对象
所以对于这些特有的问题可以按照java的对问题封装的思想
将特有的问题,进行自定义的异常封装
当在方法内部出现了throw抛出异常对象,那么就必须要给对应的处理动作
要么在内部try catch处理
要么在函数上声明让调用者处理

一般情况在,函数内出现异常,函数上需要声明
发现打印的结果中只有异常的名称,却没有异常的信息
因为自定义的异常并未定义信息

定义异常信息的方法:
父类中已经把异常信息的操作都完成了
所以子类只要在构造时,将异常信息传递给父类通过super语句
那么就可以直接通过getMessage方法获取自定义的异常信息。

自定义异常:
必须是自定义类继承Exception。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Test {  
  2.     public static void main(String[] args) {  
  3.         int a = 0;  
  4.         try {  
  5.             a = add(4,-1);  
  6.         } catch (FuShuException e) {  
  7.             System.out.println(e.toString());  
  8.             a = -1;  
  9.         }  
  10.         System.out.println(a);  
  11.     }  
  12.     public static int add(int a, int b) throws FuShuException{  
  13.         if (a < 0 || b < 0) {  
  14.             throw new FuShuException("有负数");  
  15.         }  
  16.         return a+b;  
  17.     }  
  18. }  
  19. class FuShuException extends Exception {  
  20.     private String msg;  
  21.     FuShuException(String msg) {  
  22.         super(msg);  
  23.     }  
  24.     public String getMessage() {  
  25.         return msg;  
  26.     }  
  27. }  
为什么继承Exception:
异常体系有一个特点:因为异常类和异常对象需要被抛出
它们都具备可抛性这个可抛性是Throwable这个体系中独有特点
只有这个体系中的类和对象才可以被throws和throw操作

毕老师讲课例:

[java]  view plain copy
  1. class  ExceptionTest  
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         Teacher t = new Teacher("teacher Bi"); //创建对象毕老师  
  6.         try  
  7.         {  
  8.             t.prelect();  
  9.         }  
  10.         catch (NoPlanException e)  
  11.         {  
  12.             System.out.println(e.toString());  
  13.             System.out.println("change the teacher");  
  14.         }  
  15.     }  
  16. }  
  17. class Computer  
  18. {  
  19.     private int state = 3;  
  20.     public void run() throws LanPingException,MaoYanException  
  21.     {  
  22.         if (state == 2)//此时状况抛出蓝屏异常  
  23.         {  
  24.             throw new LanPingException("blue screen");  
  25.         }  
  26.         if (state ==3)//此时状况抛出冒烟异常  
  27.         {  
  28.             throw new MaoYanException("maoyan l ");  
  29.         }  
  30.         System.out.println("computer run");//非特殊状况时正常运行  
  31.     }  
  32.     public void reset()  
  33.     {  
  34.         state = 1;  
  35.         System.out.println("computer reset");     
  36.     }  
  37.   
  38. }  
  39. class LanPingException extends Exception //封装蓝屏异常  
  40. {  
  41.     LanPingException(String message)  
  42.     {  
  43.         super(message);  
  44.     }  
  45. }  
  46. class MaoYanException extends Exception//封装冒烟异常  
  47. {  
  48.     MaoYanException(String message)  
  49.     {  
  50.         super(message);  
  51.     }  
  52. }  
  53. class Teacher //定义教师类  
  54. {  



5.throws 和throw的区别
throws使用在函数上
throw使用在函数内

throws后面跟的是异常类,可以跟多个,用逗号隔开
throw后跟的是异常对象

6.RuntimeExcepiton

a.如果在函数中抛出RuntimeException异常,函数上可以不用声明,编译也会通过

b.如果在函数上声明了RuntimeException异常,调用者可以不同进行处理,编译通过

之所以不用在方法上声明,是因为不需要让调用者处理

当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况希望停止程序后对代码进行修改

如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Test {  
  2.     public static void main(String[] args) {  
  3.         int c = add(1,2);  
  4.         System.out.println(c);  
  5.     }  
  6.     public static int add(int x, int y) {  
  7.         if (x + y < 5) {  
  8.             throw new AException("不符合条件");  
  9.         }  
  10.         return x + y;  
  11.     }  
  12. }  
  13. class AException extends RuntimeException {  
  14.     private String msg;  
  15.     AException(String msg) {  
  16.         this.msg = msg;  
  17.     }  
  18.     public String toString() {  
  19.         return msg;  
  20.     }  
  21. }  
小结:普通异常在编译时就会出现,而Runtime异常编译时没有问题,运行时出现


7.finally

finally中存放的是一定会被执行的代码
finally代码块:通常用于关闭资源

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //第一种格式  
  2. try  
  3. {  
  4.       
  5. }  
  6. catch ()//可多个catch  
  7. {  
  8. }  
  9. //第二种格式  
  10. try  
  11. {  
  12.       
  13. }  
  14. catch ()  
  15. {  
  16. }  
  17. finally  
  18. {  
  19. }  
  20. //第三种格式  
  21. try  
  22. {  
  23. }  
  24. finally  
  25. {  
  26. }  
a.finally中定义的通常是关闭资源的代码,因为资源必须释放
*System.exit(0);jvm结束
b.finally只有一种情况不会执行,当执行到System.exit(0);

8.异常在子父类覆盖中的体现

a.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类
b.如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集
c.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常
  如果子类方法发生了异常,就必须要进行try处理,绝对不能抛

小结:由于多态的缘故,当方法中的参数是父类类型,结果传入的时子类的对象,那么如果子类抛出的不是父类的异常的本身或其子类,那么无法处理


9.包

定义包:package 包名; eg. package pack; package cn.itcast.day01;
包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰
不同包中的子类还可以访问父类中被protected权限修饰的成员
包与包之间可以使用的权限只有两种,public protected
      public  protected  default  private
同一个类中       ok         ok        ok       ok
同一个包中       ok         ok        ok
子类(不同包)     ok         ok
不同包中         ok

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package packb;  
  2. public class DemoB  
  3. {  
  4.     protected void method()  
  5.     {  
  6.         System.out.println("DemoB run");  
  7.     }  
  8. }  
  9. class C extends DemoB  
  10. {  
  11.     /* 
  12.     void method() //无法覆盖父类中的method 
  13.     { 
  14.         System.out.println("C run"); 
  15.     } 
  16.     */  
  17.     protected void method()//能覆盖,因为protected权限大于default  
  18.     {}  
  19. }  
为了简化类名的书写,使用一个关键字,import
import 包名.*; 导入该目录下所有的类(不包括子目录)
建议:尽量不要写“*”,需要用到包中的哪个类就导入哪个类
建议定义包名不要重复,可以使用url来完成定义,url是唯一的


----------------------android培训java培训、期待与您交流! ----------------------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值