(每日一转)黑马程序员----跟着老毕学Java之异常机制

来源:互联网 发布:淘宝进货网哪个网站好 编辑:程序博客网 时间:2024/05/16 07:31

异 常

概述:

是什么?是对问题的描述,将问题进行对象的封装。其实就是程序在运行时出现的不正常情况。

异常由来:问题也是现实生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种,一种是严重的问题,一种是非严重的问题。

对于严重的:java通过Error类进行描述。

对于Error一般不编写针对性的代码对其进行处理

对于非严重的,java通过Exception类进行描述。

对于Exception可以使用针对性的方式进行处理。

无论Error还是Exception都具有一些共性内容。

比如:不正常情况的信息,引发原因等。

异常体系:

Throwable

|--Error

|--Exception

|--RuntimeException

异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。也就是说可以被throw和throws关键字所操作。

只有异常体系具备这个特点。

----------------------

throw和throws的用法:

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个逗号隔开。

当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。

注意:RuntimeException除外,也就是说,函数内如果抛出的是RuntimeException异常,函数上可以不用声明。

RuntimeException

Exception 中有一个特殊的子类异常RuntimeException运行时异常。

如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。

如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。

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

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

让程序员对代码进行修正。

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

如果函数声明了异常,调用者需要进行处理。处理方式可以throws也可也try。

异常的分类

两种:

编译时被检测异常

该异常在编译时如果没有处理(没有throws也没有try),那么编译失败。

该异常被标识,代表着可以被处理。

运行时异常,(编译时不检测)

在编译时不需要处理,编译器不检查。

该异常发生,建议不处理,让程序停止,需要对代码进行修正。

----------------------

异常处理的语句:

try

{

需要被检测的代码:

}

catch()

{

处理异常的代码。

}

finally

{

一定会执行的代码。

}

有三个格式

1.

try

{

}

catch()

{

}

2.

try

{

}

finally

{

}

3.

try

{

}

catch()

{

}

finally

{

}

注意:

1.finally中定义的通常是关闭资源代码。因为资源必须释放。

2.finally只有一种情况不会执行。当执行到System.exit(0);finally不会执行。

自定义异常

为什么要自定义异常?因为项目汇总会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对这些特有的问题可以按照java的对问题封装的思想,将特有的问题,进行自定义的异常封装。

定义类继承Exception或者RuntimeException,原因如下:

1.为了让该在自定义类具备可抛性。

2.让该类具备操作异常的共性方法。

当要定义自定义异常的信息时,可以使用父类已经定义好的功能。

将异常信息传递给父类的构造函数。

class MyException extends Exception

{

MyException(Stringmessage)

{

super(message);

}

}

异常的好处

1.将问题进行封装。

2.将正常流程代码和问题处理代码相分离,方便阅读。

异常的处理原则:

1.处理方式有两种:try或者throws。

2.调用到抛出异常的功能时,抛出几个,就处理几个。

就出现了一个try对应多个catch

3.多个catch,父类的catch放到最下边。

4.catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace和输出语句。

也不要不写(因为如果出现问题,看不到问题所在)。

当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

try{

throw new AException();

}

catch(AException e)

{

throw e;

}

可以该异常处理不了,但并不属于该功能出现的异常,可以将该异常转换后,再抛出和该功能

相关的异常。

或者异常可以处理,但需要将异常产生和本功能相关的问题提供出去,让调用者知道并处理,也可以将异常处理后,转换成新的异常。

try{

throw new AException();

}

catch(){

//对AException处理,处理本层的异常

throw new BException();//抛出调用者所在层的相关异常。

}

异常的注意事项

在子父类覆盖时:

1.子类抛出的异常必须是父类的异常的子类或者子集。

2.如果父类或者接口没有异常抛出时,子类覆盖出现异常只能try不能抛。

示例1:老师用电脑上课

[java] view plaincopyprint?
  1. package bxd.day09;
  2. /*
  3. 毕老师用电脑上课。
  4. 开始思考上课中出现的问题
  5. 比如问题是:
  6. 电脑蓝屏
  7. 电脑冒烟
  8. 要对问题进行描述,封装成对象。
  9. 可是当冒烟发生后,出现讲课进度无法继续,
  10. 出现了讲师的问题:课时计划无法完成。
  11. */
  12. class LanPingExceptionextends Exception
  13. {
  14. LanPingException(String message)
  15. {
  16. super(message);
  17. }
  18. }
  19. class MaoYanExceptionextends Exception//RuntimeException
  20. {
  21. MaoYanException(String message)
  22. {
  23. super(message);
  24. }
  25. }
  26. class NoPlanExceptionextends Exception
  27. {
  28. NoPlanException(String msg)
  29. {
  30. super(msg);
  31. }
  32. }
  33. class Computer
  34. {
  35. private int state =3;
  36. public void run()throws LanPingException,MaoYanException
  37. {
  38. if(state ==2)
  39. throw new LanPingException("蓝屏了");
  40. if(state ==3)
  41. throw new MaoYanException("冒烟了");
  42. System.out.println("电脑运行");
  43. }
  44. public void reset()
  45. {
  46. state = 1;
  47. System.out.println("电脑重启");
  48. }
  49. }
  50. class Teacher
  51. {
  52. private String name;
  53. private Computer cmpt;
  54. Teacher(String name)
  55. {
  56. this.name = name ;
  57. cmpt = new Computer();
  58. }
  59. public void prelect()throws NoPlanException
  60. {
  61. try
  62. {
  63. cmpt.run();
  64. }
  65. catch (LanPingException e)
  66. {
  67. cmpt.reset();
  68. }
  69. catch (MaoYanException e)
  70. {
  71. //throw e;
  72. test();//test()不能放在throw语句之后。
  73. throw new NoPlanException("课时无法继续"+e.getMessage());
  74. }
  75. System.out.println("讲课");
  76. }
  77. public void test()
  78. {
  79. System.out.println("练习");
  80. }
  81. }
  82. class ExceptionTest
  83. {
  84. public staticvoid main (String [] args)
  85. {
  86. Teacher t = new Teacher("毕老师");
  87. try
  88. {
  89. t.prelect();
  90. }
  91. catch (NoPlanException e)
  92. {
  93. System.out.println(e.toString());
  94. System.out.println("换老师或者放假");
  95. }
  96. }
  97. }


示例2:图形面积

[java] view plaincopyprint?
  1. package bxd.day09;
  2. /*
  3. 有一个圆形和长方形
  4. 都可以获取面积,对于面积如果出现非法的数值,视为获取面积时出现的问题
  5. 问题通过异常表示。
  6. 现在对这个程序进行基本设计。
  7. try catch 可以把正常代码和异常处理代码分离开。
  8. */
  9. class NoValueException extends RuntimeException
  10. {
  11. NoValueException(String msg)
  12. {
  13. super(msg);
  14. }
  15. }
  16. interface Shape
  17. {
  18. void getArea();
  19. }
  20. class Rec implements Shape
  21. {
  22. private int len,wid;
  23. Rec(int len,int wid)//throws NoValueException
  24. {
  25. if(len<=0 || wid<=0)
  26. throw new NoValueException("出现非法值");
  27. this.len = len;
  28. this.wid = wid;
  29. }
  30. public void getArea()
  31. {
  32. System.out.println(len*wid);
  33. }
  34. }
  35. class Circle implements Shape
  36. {
  37. private double random;
  38. public staticdouble PI = 3.14;
  39. Circle(double random)
  40. {
  41. if(random<=0)
  42. throw new NoValueException("半径出现非法值");
  43. this.random = random;
  44. }
  45. public void getArea()
  46. {
  47. System.out.println(random*random*PI);
  48. }
  49. }
  50. public class ExceptionTest1
  51. {
  52. public staticvoid main(String[] args) //throws NoValueException
  53. {
  54. Rec r = new Rec(3,4);
  55. r.getArea();
  56. Circle c = new Circle(-3);
  57. c.getArea();
  58. System.out.println("over");//异常继承Exception时,该打印语句会执行;继承Runtime Exception时,该打印语句不执行
  59. }
  60. }


package

包的作用:对类文件进行分类管理,给类提供多层命名空间,包也是一种封装形式。

注意事项package要写在程序文件的第一行,该程序文件中的类的全称是包名.类名。

对包中的类的调用

若使用package定义包,编译时没有问题;问题主要发生在调用时。

1. 在源文件目录下,编译后使用“java包名.类名”命令,会出现“wrong name”错误提示,这是由于编译时直接编译在了当前目录下,并没有创建你定义的包。
解决方法:
a.使用“javac –d .类名”,这时会在当前目录下创建定义的包,并把class文件存放用该包中;注意“.”前后要有空格。
b.使用“javac –d指定目录类名”,会在指定目录下创建包,这时会在指定目录下创建定义的包,并把class文件放在包中;同时还有把指定的目录加进classpath中,否则会出现找不到类错误。

2外部程序包使用包中的类时,该类必须使用类名.包名(否则会报“找不到符号”错误),且类必须是public(否则会出现无法访问提示)。

总结:包与包之间进行访问,被访问的包中的类即类中的成员用public修饰。

不同包中的子类还可以直接访问父类中被protected权限修饰的成员。

包与包之间可以使用的权限,只有publicprotected两种。

权限修饰符比较:

public

protected

default

private

同一个类中

同一个包中

×

子类

×

×

不同包中

×

×

×

import

import关键字作用:导入包中的类。

注意:1.导入包时,并不导入包中的子包,如需子包中的类,需要导入子包。

1. 建议不要使用“*”,只导入自己需要的类。

2. 如果两个包中有重名的类时,则该类必须加包名。

3. 为了避免包重复,建议使用urlurl地址反转)来完成定义包。

4. 包名要全部都是小写。

jar

jar包是java的压缩包,作用:方便项目的携带;方便使用,只要在classpath设置jar路径即可;数据库驱动,SSH框架等都是以jar包体现的。

使用方法:jar命令,例如“jar –cf haha.jar packa packb”即把包packapackb压缩成haha.jar文件;“jar –tf a.jar>c:\1.txt ”,把a.jar包中的详细信息写入1.txt文件中,注意dos窗口中“>”的使用。

Jar包相当于被压缩包的根目录,设置classpath=%classpath%;绝对路径\haha.jar,就可以使用指定目录下的haha.jar中的类。通过jar命令还可以实现双击运行功能(如果jar包中有main函数)。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 练瑜伽前躯不行怎么办 月子里碰冷水了怎么办 月子手碰凉水了怎么办 月子里碰了冷水怎么办 顺产后下面会痛怎么办 产后肚子瘦不下来怎么办 出月子后臀部很疼怎么办 做月子时臀部疼怎么办 月子臀部大腿疼困怎么办 产后抱孩子腰疼怎么办 剖腹产后5年小肚子很大怎么办 压力大工作忙瘦了怎么办? 哺乳乳房一大一小怎么办 哺乳期乳房一大一小怎么办 上班之后奶少了怎么办 出了月子还流恶露怎么办? 剖腹产2年刀疤痒怎么办 刨宫产6天伤口痒怎么办 脸的皮肤油油的怎么办 狗狗子宫蓄脓怎么办 刮宫后子宫壁薄怎么办 产妇有痔疮怎么办很疼 二胎着床在剖腹产切口怎么办 刨腹产3月后怀孕怎么办 破腹产两年了肚子还是很大怎么办 抛妇产后肚子大怎么办 破腹产后想大便怎么办 破腹产后肚子硬怎么办 在月子里同房了怎么办 胃变大凸出来了怎么办 坐完月子脊背疼怎么办 月子过后脊背疼该怎么办 怀孕的时候牙疼怎么办 练瑜伽后弯腰疼怎么办 练完瑜伽腰椎疼怎么办 瑜伽开髋动作受伤怎么办 才学瑜伽教培上课紧张怎么办 瑜伽馆不给退费怎么办 脚运动后酸痛该怎么办 婴儿误吞拉链头怎么办 肠功能蠕动慢便秘怎么办