20天jvava(13)

corejava day08 - 内部类(2)、处理日期、异常机制
2011/08/02
========================================================
1.内部类(2)
1)内部类的种类:静态内部类、成员内部类、
局部内部类、匿名类
c.局部内部类:在一个方法中定义的类,
它的可见范围是当前方法。
特点:和局部变量一样,局部内部类不能使用访问修饰符
及static关键字。
局部内部类只能在当前方法中使用。
局部内部类不能包含静态成员。
局部内部类可以访问外部类的所有成员。
课堂练习1:Arrays.sort(T[],Comparator) 使用比较器和匿名类进行排序
Comparator接口:比较器,定义元素之间比较的规则
方法:int compare(Object arg0,Object arg1);
规则:compareTo(a,b)>0,a>b
compareTo(a,b)==0,a==b
compareTo(a,b)<0,a<b

d.匿名内部类,匿名类:一种特殊的内部类,
但没有类名。匿名类的程序代码比较简洁。
特点:匿名类可以继承父类,还可以实现接口。
匿名类本身没有构造方法,但会调用父类无参构造方法。
通常在定义引用变量的同时定义匿名类。
匿名类可以访问外部类的所有成员。
方法中的匿名类只能访问方法中final类型的变量
和参数。

匿名类的典型应用:事件处理
单击按钮、移动鼠标、关闭窗口,
GUI桌面程序都会接收相应的事件。
每一个触发事件的组件称为事件源,事件源负责触发事件和注册监听器
每一种事件都对应专门的监听器,由监听器负责接收和处理事件。
事件(对象)是由事件源在运行时传递给监听器的。
javax.swing.JButton类:方法addActionListener(ActionListener)
用于添加监听器
ActionListener接口的方法:void actionPerformed(ActionEvent)

2.处理日期:Date、SimpleDateFormat、Calender
1)java.util.Date类:表示日期和时间的类,
封装一个long类型的数据,
表示与GMT(格林威治标准时间)的
1970年1月1日00:00:00这一刻所相距的毫秒数。
a.构造方法:Date() - 创建一个代表当前日期和时间的Date对象,内部调用System.currentTimeMills()方法获取当前时间
Date(long date) - 根据自标准时间以来的毫秒数创建Date对象
b.常用方法:
long getTime() - 返回自标准时间以来的毫秒数
int compareTo(Date anotherDate) - 比较两个日期的顺序。
日期相等返回 0,小于参数anotherDate返回负数,
大于参数anotherDate返回正数
boolean equals(Object obj) - 比较两个日期是否相等

2)java.text.SimpleDateFormat类:
用于定制日期的格式
a.构造方法:SimpleDateFormat(String pattern)
- 根据日期和时间模式创建SimpleDateFormat对象,
如SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
日期和时间模式有:y - 年
M - 月
d - 日
h - 小时
m - 分钟
s - 秒
b.常用方法: String format(Date date) -
将参数date格式化成字符串
Date parse(String source) -
将日期时间模式的字符串转换成Date,
需处理异常ParseException
3)java.util.Calendar类:
Calendar 是历法(公历, 阳历, 太阳历, 农历, ...)的的抽象,
GregorianCalendar 是历法的实现,
采用公历算法实现的.
a.获取Calendar对象:
static Calendar getInstance();
b.Calendar中的常用常量:
YEAR、MONTH、DAY、HOUR、MINUTE、SECOND
c.常用方法:int get(int field) -
返回给定日历常量的字段值
void set(int field,int value) -
设置给定日历常量的字段值
void set(int year,int month,
int day[,int hour,int minute,int second]) - 设置时间字段的值
void setTime(Date date) -
使用给定的date设置Calendar的时间
Date getTime() - 返回Calendar对应的Date对象
void add(int field,int amount) -
为给定的日期字段添加指定的时间量amount

date.setTime(long) cal.setTime(Date);
----------> --------->
long <---------- Date <--------- Calendar
date.getTime() cal.getTime()

3.Java中的异常机制
1) 行为的意外结果,
Java异常机制允许使用统一标准的方式初始意外结果,
Java通过异常类(Throwable,Exception,...)
封装意外结果
2) 一个方法如果抛出了异常,
这个方法就必须声明异常的抛出.
异常的声明:在方法上声明方法的意外结果,如:
User reg(String name, String pwd, String email)
throws UserExistException;
User login(String name, String pwd)
throws NameOrPwdException;
3) 异常类一般继承于Exception
4) 调用抛出异常的方法,必须处理异常
a. 使用try catch finally 捕获
try{
代码
}catch(Exception e){
}finally{
}
b. 直接再抛出异常
c. 捕获 再抛出.
处理方式,依赖于具体业务逻辑,很灵活。
5) 如果代码有异常发生,异常以后的代码将不再执行。
6) try catch finally
try 是尝试运行代码块,
如果有异常会被随后的catch捕获异常发生
以后代码不执行
catch代码块是异常处理代码。
需要提供合理的处理,
异常的处理 是与具体业务逻辑有关。
可以写多个catch处理一系列异常,
但是要注意:异常的大小关系,
大类型的放到后面处理。
有的时候 catch(Exception)
粗粒度处理异常,代码简洁语义含糊.
根据业务逻辑适当选用。
finally 代码块,不管是否出现异常,
总会执行的代码块。 经常用来处理现场的清理,
比如:可靠的数据库连接关闭。

7) 异常有一个基本原则:能够底层处理的尽量处理,
但是如果不能处理,
必须抛出到调用者(方法),不应该简单的抛弃。
8) 异常捕获再抛出, 是一种把底层异常进行封装,
转换为另外 一种异常类型。
9) 建议在捕获到异常时候使用:
e.printStackTrace(),打印到 控制台,输出内容是 - 出现异常时候的方法调用堆栈.
e.getMessage(),返回String类型的异常信息
10) 异常的分类
Throwable 异常类的基类,封装异常信息的一些方法,
如e.printStackTrace()方法、getMessage()方法
|--Error 表示依靠程序本身无法恢复的严重错误,由JVM抛出
| |--OutOfMemoryError 堆内存溢出
| |--StackOverflowError 栈内存溢出
|--Exception 表示程序本身可以处理的异常。
当程序运行时出现这类异常时,应该尽可能处理异常,
使程序恢复运行
|--java.text.ParseException format解析对象时候发生
| 如:Date d = dateformat.parse("2010-1-1");
|--RuntimeException 运行时异常,
Java忽略对 这类异常的语法检查。
当程序中出现这类异常时,
即使没有使用try...catch捕获它,程序会编译通过。
|--IllegalArgumentException 非法参数异常
|--NullPointerException 空指针异常
|--ArrayIndexOutOfBoundsException
数组下标越界异常
|--ClassCastException 类型转换异常
|--NumberFormatException 数值格式化异常, Integer.parseInt()
11) 软件中会大量使用自定义异常,一般从Exception继承, 异常类命名要有实际意义。

作业
1 复习实现全部课堂案例代码
2 实现时间的计算: 根据身份证号码计算一个人的生日
3 时间计算: 计算劳动合同的续签日
输入: 劳动合同的签订日期 和签订年限
返回: 劳动合同的续签日
规则: 劳动合同的到期日的前一个月, 如果周末顺延到周一
方法参考:public static Date signDate(Date create, int years)
4 (选做) 有食物版本 的贪吃蛇
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值