实习小结
经历了两个礼拜的找工作之后,找到了一家公司肯要我这个培训班出来非计算机专业的学生,虽然并不是很满意这样的结果,但是目前来说,找一个稳妥的工作好好积攒工作经验才是最需要的。
实习第一天,虽说没有什么重要的任务去做,还是从基础做起,锻炼自己的编码能力,继续敲写着连接数据库,进行增删改查的任务。本以为并没有什么多大的问题,但是动手编写的时候,还是遇到了不少的问题。
问题一:java.util.NoSuchElementException异常
第一次遇到这个问题,把代码逻辑检查了好几遍,都是简单的从控制台获取数据,封装在对象中,这么简单的逻辑怎么会出错呢。经过一番debug和百度之后,找到了问题的出处。
在A方法中使用了Scanner,使用完后将它进行了关闭,后面的代码调用了B方法,但是B方法中也使用了Scanner,此时就会抛出java.util.NoSuchElementException异常。
报错的原因:
在第一次使用Scanner之后,使用scan.close()关闭资源,会把System.in关闭。当后面代码中再进行Scanner scan = new Scanner(System.in)读取操作时,因为输入流已经关闭,所以读取的值会是-1,从而会导致异常。
解决的办法:
在方法的最后处理未关闭的资源。
参考的博客:
首先看一个例子:
public class test {
public static void inputinfo(){
Scanner scan = new Scanner(System.in);
System.out.println("请输入编号:");
int num = scan.nextInt();
System.out.println("请输入姓名:");
String name = scan.nextLine();
System.out.println("请输入性别:");
String sex = scan.nextLine();
}
public static void main(String[] args) {
inputinfo();
}
}
这是一个简单的从控制台接收信息的方法,运行程序,输入编号之后,输入姓名和性别的提示同时打印出
异常的原因:
在使用nextInt()后面不能使用nextLine(),这是由于nextLine() 的特殊性。next()和nextLine()的区别在于,next()一定后读取到有效字符才可以结束输入,对于输入有效字符之前的空格键,tab键和enter键为结束的,next()将会自动去掉。nextLine()的结束符只是enter键,输入中可以带空格等。
因为nextInt()只读取数值,剩下的“\n”并没有读取,当执行到下面的nextLine()时,会读取“\n”,并结束,所以输入姓名那行貌似没有输入就执行了。
解决的办法:
(1)使用next();
(2)在name前加一个变量用来接收多出来的“\n”
Scanner scan = new Scanner(System.in);
System.out.println("请输入编号:");
double num = scan.nextDouble();
String ch = scan.nextLine();
System.out.println("请输入姓名:");
String name = scan.nextLine();
参考的博客:
废话不多数,上例子
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入一句话:");
String str= scan.nextLine();
System.out.println(str);
}
异常的原因:
java源文件的字符集为utf-8,由于Window平台默认是GBK的字符集,而在JVM启动的时候会采用操作系统的字符集,所以在控制台输出时可能发生乱码。
解决的办法:
在eclipse安装目录下找到eclipse.ini文件,打开文件,在里面追加-Dfile.encoding=utf-8,重启eclipse就会正常。
参考的博客:
eclipse.ini
http://surenpi.com/2016/02/19/eclipse-ini/
问题四:日期转换问题
(1)在进行对数据的增删改查时,经常会涉及到java.util.Date和java.sql.Date之间的转换问题,转换思路如下:
// 将java.util包下的Date对象转为java.sql包下的date
public static java.sql.Date utilDateToSqlDate(Date date) {
// 获取了毫秒值ֵ
long millisTime = date.getTime();
// 根据毫秒值来获取java.sql包下的Date对象
java.sql.Date pubTime = new java.sql.Date(millisTime);
return pubTime;
}
(2)将一个字符串转换成Date类型
public static Date strDate(String time) {
Date date = null;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
date = df.parse(time);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
问题五:数据库表中生日字段为Date类型,展示数据时根据当前时间算出相应的年龄
MySql中根据生日计算年龄的方法:
SELECT ROUND(DATEDIFF(CURDATE(), @birthday)/365.2422)
DATEDIFF()函数返回连个日期之间的天数。
参考博客:
问题六:MySql中的三表left join写法
使用Mysql的多表连接时,一表中的字段在另一表中没有对应的记录,需要将其显示出来,需要使用到left join,两个表之间的左外连接容易写,三个表之间的连接就无从下手
现有如下,表stu_info中标志属性为stu_id,表project中标志属性为pro_id,表stu_pro_relation是中间表,字段为stu_id和pro_id。
需要查询出所有学生的信息,以及所过的项目(没有做过项目的学生也要展示,这里需要使用左外连接),Sql语句如下:
SELECT s.stu_id,s.stu_name,CEIL(DATEDIFF(CURDATE(), s.birthday) / 365.2422) age,s.sex,s.school,p.pro_id,p.pro_name,p.`code`
FROM (stu_info s LEFT JOIN stu_pro_relation spr ON s.stu_id = spr.stu_id) LEFT JOIN project p ON p.pro_id = spr.pro_id
先将其中一表和中间表连接,将这个结果再和最后一个表进行连接。
参考博客:
MySql的join(连接)查询 (三表 left join 写法)
http://blog.csdn.net/chentaocba/article/details/7697825