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

异常:

是什么?是对问题的描述。将问题进行对象的封装。

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

异常体现:

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