实习小结(一)

  经历了两个礼拜的找工作之后,找到了一家公司肯要我这个培训班出来非计算机专业的学生,虽然并不是很满意这样的结果,但是目前来说,找一个稳妥的工作好好积攒工作经验才是最需要的。

实习第一天,虽说没有什么重要的任务去做,还是从基础做起,锻炼自己的编码能力,继续敲写着连接数据库,进行增删改查的任务。本以为并没有什么多大的问题,但是动手编写的时候,还是遇到了不少的问题。

 

问题一:java.util.NoSuchElementException异常

  第一次遇到这个问题,把代码逻辑检查了好几遍,都是简单的从控制台获取数据,封装在对象中,这么简单的逻辑怎么会出错呢。经过一番debug和百度之后,找到了问题的出处。

在A方法中使用了Scanner,使用完后将它进行了关闭,后面的代码调用了B方法,但是B方法中也使用了Scanner,此时就会抛出java.util.NoSuchElementException异常。

报错的原因:

  在第一次使用Scanner之后,使用scan.close()关闭资源,会把System.in关闭。当后面代码中再进行Scanner scan = new Scanner(System.in)读取操作时,因为输入流已经关闭,所以读取的值会是-1,从而会导致异常。

解决的办法:

  在方法的最后处理未关闭的资源。

参考的博客:

  Java学习笔记之Scanner报错java.util.NoSuchElementException

  https://www.cnblogs.com/qingyibusi/p/5812725.html

 

问题二:Scanner中连续使用nextLine(),没有输入,会自动输出

首先看一个例子:

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()只读取数值,剩下的“ ”并没有读取,当执行到下面的nextLine()时,会读取“ ”,并结束,所以输入姓名那行貌似没有输入就执行了。

解决的办法:

  (1)使用next();

  (2)在name前加一个变量用来接收多出来的“ ”

Scanner scan = new Scanner(System.in);
System.out.println("请输入编号:");
double num = scan.nextDouble();
String ch = scan.nextLine();
System.out.println("请输入姓名:");
String name = scan.nextLine();

参考的博客:

  Java中关于nextInt()、next()和nextLine()的理解

  https://www.cnblogs.com/Skyar/p/5892825.html

 

问题三:控制台接收中文字符串,直接打印出来发生乱码

废话不多数,上例子

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根据出生日期计算年龄的五种方法比较

  https://www.cnblogs.com/learnapi/p/7851293.html

  

问题六: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

  

 

原文地址:https://www.cnblogs.com/ghq120/p/8552513.html