------- android培训、java培训、期待与您交流! ----------
创新互联长期为上1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为云城企业提供专业的成都网站建设、网站制作,云城网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
异常:
是什么?是对问题的描述。将问题进行对象的封装。
-----------------------------------------------------
异常体现:
Throwable
|--Error
|--Exception
|--RuntimeException
异常体系的特点:异常体系中的所有类以及建立的对象都具备可拋性。也就是说可以被throw和throws关键字所操作。只有异常体系具备这个特点。
-------------------------------------------------------
throw和throws的用法:
throw定义在函数内,用于抛出异对象。
throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。
当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,都在编译失败。
注意,RuntimeException除外。也就是说函数内如果抛出RuntimeException异常,函数上可以不用声明。
------------------------------------------------------
异常有两种:
编译时被检测异常:
该异常在编译时,如果没有处理(没有throw也没有try),编译失败。
运行时异常(编译时不检测):
在编译时,不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止。需要对代码进行修正。
如果函数声明了异常,调用者需要进行处理。处理方法可以throws,可以try。
--------------------------------------------------
异常处理语句:
try
{
需要被检测的代码;
}
catch ()
{
处理异常的代码;
}
finally
{
一定会执行的代码;
}
有三个结合格式:
1.try
{
}
catch ()
{
}
2.try
{
}
catch ()
{
}
finally
{
}
3.try
{
}
finally
{
}
注意:
1,finally中定义的通常是 关闭资源代码。因为资源必须释放。
2,finally只要一种情况不会执行。当执行到System.exit(0);finally不会执行。
--------------------------------------------
自定义异常:
定义类继承Exception或者RuntimeException
1,为了让该自定义类具备可拋性。
2,让该类具备操作异常的共性方法。
当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
将信息传递给父类构造函数。
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
自定义异常:安卓java面向对象的思想,将程序中出现的特有问题进行封装。
-------------------------------------------
异常的好处:
1,将问题进行封装。
2,将正常流程代码和问题处理代码相分离,方便于阅读。
-------------------------------------------
异常的处理原则:
1,处理方式有两种:try或者throws。
2,调用到抛出异常的功能时,抛出几个就处理几个。
一个try对应多个catch。
3,多个catch,父类的catch放到最下面。
4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。
5,当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
try
{
throw newAException();
}
catch (AException e)
{
throw e;
}
如果该异常处理不了,但并不属于该功能出现的异常。可以将异常转换后,在抛出和该功能相关的异常。
或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去。当调用者知道,并处理。也可以将捕获异常处理后,转换新的异常。
try
{
throw new AException();
}
catch (AException e)
{
//对AException处理。
throw new BException();
}
比如:汇款的例子。
-------------------------------------------
异常的注意事项:
在子父类覆盖时:
1,子类抛出的异常必须是父类的异常的子类或者子集。
2,如果父类或者接口没有异常抛出时,子类覆盖出现异常只能try不能throw。
示例:ExceptionTest.java 老师用电脑上课。
/* 毕老师用电脑上课。 开始思考上课中出现的问题:电脑蓝屏,电脑冒烟。 当冒烟发生后,老师不能继续讲课。出现了讲师的问题,课时计划无法完成。 思路: 定义两个类,老师和电脑。 老师有姓名,上课方法(使用电脑上课), 电脑冒烟时,讲师有无法完成课时计划的问题。 电脑有运行方法、重启方法。 考虑电脑可能出现的问题:电脑蓝屏,电脑冒烟,定义两个异常类。 */ class LanPingException extends Exception { LanPingException(String message) { super(message); } } class MaoYanException extends Exception { MaoYanException(String message) { super(message); } } class NoPlanException extends Exception { NoPlanException(String message) { super(message); } } class Teacher { private String name; private Computer cmpt; Teacher(String name) { this.name = name; cmpt = new Computer(); } public void prelect()throws NoPlanException { try { cmpt.run();//调用抛出异常的run方法 } catch (LanPingException e) { cmpt.reset(); } catch (MaoYanException e) { test(); throw new NoPlanException("课时无法继续"+e.getMessage());//处理不了,抛出异常,方法上抛出。 } System.out.println("讲课"); } public void test() { System.out.println("练习"); } } class Computer { private int state = 3;//代表电脑的状态。 public void run()throws LanPingException,MaoYanException { if (state == 2) throw new LanPingException("蓝屏了"); if (state == 3) throw new MaoYanException("冒烟了"); System.out.println("电脑运行"); } public void reset() { state = 1;//电脑恢复到正常状态。 System.out.println("电脑重启"); } } class ExceptionTest { public static void main(String[] args) { Teacher t = new Teacher("毕老师"); try { t.prelect(); } catch (NoPlanException e) { System.out.println(e.toString()); System.out.println("换老师或者放假"); } } }
示例:ExceptionTest1.java 图形面积。
/* 有一个圆形和长方形。 都可以获取面积。对于面积如果出现非法数值,视为是获取面积出现问题。 问题通过一次来表示。 先要对这个程序进行基础设计。 思路: 1,定义抽象图形类(或接口),获取面积方法。 2,圆形,长方形类继承图形类。 3,对问题进行描述。 */ class NoValueException extends RuntimeException { NoValueException(String message) { super(message); } } interface Shape { void getArea(); } class Rec implements Shape { private int len,wid; Rec(int len,int wid)//throws NoValueException { if (len<=0 || wid <= 0) throw new NoValueException("非法值"); this.len = len; this.wid = wid; } public void getArea() { System.out.println(len*wid); } } class Circle implements Shape { public static final double PI = 3.14; private int radius; Circle(int radius) { if (radius <=0) throw new NoValueException("非法半径"); this.radius = radius; } public void getArea() { System.out.println(radius*radius*PI); } } class ExceptionTest1 { public static void main(String[] args) { /* try { Rec r = new Rec(-3,4); r.getArea(); } catch (NoValueException e) { System.out.println(e.toString()); } */ //Rec r = new Rec(-3,4); //r.getArea(); Circle c = new Circle(-3); c.getArea(); } }
包:
定义包用package关键字。
1:对类文件进行分类管理。
2:给类文件提供多层名称空间。
如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中即可。
一般在定义包名时,因为包的出现是为了区分重名的类。所以包名要尽量唯一。怎么保证唯一性呢?可以使用url域名来进行包名称的定义。
package pack;//定义了一个包,名称为pack。 注意:包名的写法规范:所有字母都小写。
//package cn.itcast.pack.demo;
类的全名称是 包名.类名
编译命令:javac –d 位置(.当前路径) java源文件 (就可以自动生成包)
包是一种封装形式,用于封装类,想要被包以外的程序访问,该类必须public;类中的成员,如果被包以外访问,也必须public;
包与包之间访问可以使用的权限有两种:
1:public
2:protected:只能是不同包中的子类可以使用的权限。
java中的四种权限:
范围 public protected default private
同一个类中 ok ok ok ok
同一包中 ok ok ok
子类 ok
不同包中 ok
----------------------------------------------------
Import- 导入:类名称变长,写起来很麻烦。为了简化,使用了一个关键字:import,可以使用这个关键字导入指定包中的类。记住:实际开发时,到的哪个类就导入哪个类,不建议使用*.
import packa.*;//这个仅仅是导入了packa当前目录下的所有的类。不包含子包。
import packa.abc.*;//导入了packa包中的子包abc下的当前的所有类。
如果导入的两个包中存在着相同名称的类。这时如果用到该类,必须在代码中指定包名。
常见的软件包:
java.lang : language java的核心包,Object System String Throwable jdk1.2版本后,该包中的类自动被导入。
java.awt : 定义的都是用于java图形界面开发的对象。
javax.swing:提供所有的windows桌面应用程序包括的控件,比如:Frame , Dialog, Table, List 等等,就是java的图形界面库。
java.net : 用于java网络编程方面的对象都在该包中。
java.io : input output 用于操作设备上数据的对象都在该包中。比如:读取硬盘数据,往硬盘写入数据。
java.util : java的工具包,时间对象,集合框架。
java.applet: application+let 客户端java小程序。server+let --> servlet 服务端java小程序。
jar :java的压缩包,主要用于存储类文件,或者配置文件等。
命令格式:jar –cf 包名.jar 包目录
解压缩:jar –xvf 包名.jar
将jar包目录列表重定向到一个文件中:jar –tf 包名.jar >c:\1.txt
本文题目:黑马程序员——异常篇
网站地址:http://lswzjz.com/article/jdjoei.html