看老外java.sql.data中data的处理
2010-11-29 23:27
225 查看
今天写了个小程序,是一个注册页面,将注册信息加入到Mysql数据库中,在注册页面中对数据没有进行校验,写完后,自己试了试,发现很好。然后让同学也来试了试,结果一运行就出错。后来才发现是data型数据转换时错了。
我用了
Data birthday=java.sql.Date.valueOf(sbirthday.trim());
这样的方式来进行数据转换,结果问题就是出现在这里。
我同学输入生日日期是输入的 1988-8-8,一旦不是按照 yyyy-mm-dd 的格式就出错。我想难道这样的日期就不能转换吗?
然后我查看了 jdk1.6的源代码:它竟然就是这样处理的:
public static Date valueOf(String s) {
final int YEAR_LENGTH = 4;//定义了年的长度。
final int MONTH_LENGTH = 2;//定义了月的长度
final int DAY_LENGTH = 2;//定义了日的长度
final int MAX_MONTH = 12;//定义了月的最大长度
final int MAX_DAY = 31;//定义了日的最大长度
int firstDash;//定义了一个角标(我也不知道怎么称呼)
int secondDash;//定义了一个角标(我也不知道怎么称呼)
Date d = null;//预定义了日期。
if (s == null) {
throw new java.lang.IllegalArgumentException();
}
firstDash = s.indexOf('-');
secondDash = s.indexOf('-', firstDash + 1);
if ((firstDash > 0) && (secondDash > 0) && (secondDash < s.length()-1)) {
String yyyy = s.substring(0, firstDash);
String mm = s.substring(firstDash + 1, secondDash);
String dd = s.substring(secondDash + 1);
//问题就出现在这里,它会先校验切割后的日期是否年为4位,月为2位,日为2位,否则d就为null,抛出异常。
//难道老外就不会处理吗?
if (yyyy.length() == YEAR_LENGTH && mm.length() == MONTH_LENGTH &&
dd.length() == DAY_LENGTH) {
int year = Integer.parseInt(yyyy);
int month = Integer.parseInt(mm);
int day = Integer.parseInt(dd);
if (month >= 1 && month <= MAX_MONTH) {
int maxDays = MAX_DAY;
switch (month) {
// February determine if a leap year or not
case 2:
if((year % 4 == 0 && !(year % 100 == 0)) || (year % 400 == 0)) {
maxDays = MAX_DAY-2; // leap year so 29 days in February
} else {
maxDays = MAX_DAY-3; // not a leap year so 28 days in February
}
break;
// April, June, Sept, Nov 30 day months
case 4:
case 6:
case 9:
case 11:
maxDays = MAX_DAY-1;
break;
}
if (day >= 1 && day <= maxDays) {
d = new Date(year - 1900, month - 1, day);
}
}
}
}
//如果你的日期格式不正确,那就等着抛出异常吧!!!
if (d == null) {
throw new java.lang.IllegalArgumentException();
}
return d;
}
看来,老外写代码是非常严谨的。他会把这个问题交给用户处理,然后按照你交给他的合格数据进行严格的处理。否则会出现很多格式不严谨的数据提交给jdk,那就乱了!
看源代码会发现好多问题。
我用了
Data birthday=java.sql.Date.valueOf(sbirthday.trim());
这样的方式来进行数据转换,结果问题就是出现在这里。
我同学输入生日日期是输入的 1988-8-8,一旦不是按照 yyyy-mm-dd 的格式就出错。我想难道这样的日期就不能转换吗?
然后我查看了 jdk1.6的源代码:它竟然就是这样处理的:
public static Date valueOf(String s) {
final int YEAR_LENGTH = 4;//定义了年的长度。
final int MONTH_LENGTH = 2;//定义了月的长度
final int DAY_LENGTH = 2;//定义了日的长度
final int MAX_MONTH = 12;//定义了月的最大长度
final int MAX_DAY = 31;//定义了日的最大长度
int firstDash;//定义了一个角标(我也不知道怎么称呼)
int secondDash;//定义了一个角标(我也不知道怎么称呼)
Date d = null;//预定义了日期。
if (s == null) {
throw new java.lang.IllegalArgumentException();
}
firstDash = s.indexOf('-');
secondDash = s.indexOf('-', firstDash + 1);
if ((firstDash > 0) && (secondDash > 0) && (secondDash < s.length()-1)) {
String yyyy = s.substring(0, firstDash);
String mm = s.substring(firstDash + 1, secondDash);
String dd = s.substring(secondDash + 1);
//问题就出现在这里,它会先校验切割后的日期是否年为4位,月为2位,日为2位,否则d就为null,抛出异常。
//难道老外就不会处理吗?
if (yyyy.length() == YEAR_LENGTH && mm.length() == MONTH_LENGTH &&
dd.length() == DAY_LENGTH) {
int year = Integer.parseInt(yyyy);
int month = Integer.parseInt(mm);
int day = Integer.parseInt(dd);
if (month >= 1 && month <= MAX_MONTH) {
int maxDays = MAX_DAY;
switch (month) {
// February determine if a leap year or not
case 2:
if((year % 4 == 0 && !(year % 100 == 0)) || (year % 400 == 0)) {
maxDays = MAX_DAY-2; // leap year so 29 days in February
} else {
maxDays = MAX_DAY-3; // not a leap year so 28 days in February
}
break;
// April, June, Sept, Nov 30 day months
case 4:
case 6:
case 9:
case 11:
maxDays = MAX_DAY-1;
break;
}
if (day >= 1 && day <= maxDays) {
d = new Date(year - 1900, month - 1, day);
}
}
}
}
//如果你的日期格式不正确,那就等着抛出异常吧!!!
if (d == null) {
throw new java.lang.IllegalArgumentException();
}
return d;
}
看来,老外写代码是非常严谨的。他会把这个问题交给用户处理,然后按照你交给他的合格数据进行严格的处理。否则会出现很多格式不严谨的数据提交给jdk,那就乱了!
看源代码会发现好多问题。
相关文章推荐
- java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
- Oracle error 1403: java.sql.SQLException: ORA-01403: no data found ORA-06512: at line 1 has been det
- java.sql.SQLException: ORA-01790: expression must have same datatype as corresponding expression
- java.sql.BatchUpdateException: Data truncated for column 'nowCost' at row 1
- java.sql.SQLException: Before start of result set异常及处理办法
- java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
- java防SQL注入,HTML 特殊字符,JavaScript 特殊字符,SQL 特殊字符 处理
- JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法
- java.sql.Exception:setString 只能处理少于 32766 个字符的字符串
- TransientDataAccessResourceException和java.sql.SQLException: boo!
- Java根据年龄段获取对应年份起始时间戳和最终时间戳、根据生日时间戳获取月份(与数据库的时间戳处理成的月份拼接成SQL条件)
- java.sql.DataTruncation: Data truncation at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagn异常
- java.sql.BatchUpdateException: Data truncation: Data too long for column 'site_name' at row 1
- 错误调试java.sql.DataTruncation: Data truncation
- Caused by: java.sql.DataTruncation: Data truncation
- java.sql.SQLException: Before start of result set异常及处理办法
- java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
- jdbc-mysql基础 java.util.sql.timestamp与mysql中datatime类型相对应可以相互访问
- [Spark][Python][DataFrame][SQL]Spark对DataFrame直接执行SQL处理的例子
- [Java语言] JDBC: 批量处理提高SQL处理速度