3月7日工作内容

First Post:

Last Update:

3月7日工作内容

Java复习

新发现:字符输出流及字符缓冲输出流没关闭可能会出现数据未刷新

输出文件的时候如果没有自行调用bufferedWriter.flush()或者bufferedWriter.close(),可能会出现文件内容没有写入的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void main(String[] args) {
String[] str = {"春眠不觉晓", "处处闻啼鸟", "夜来风雨声", "花落知多少"};
File file = new File("data/2.txt");
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
try {
fileWriter = new FileWriter(file);
bufferedWriter = new BufferedWriter(fileWriter);
for (String s : str) {
bufferedWriter.write(s);
bufferedWriter.newLine();
}
// 刷新进去
bufferedWriter.flush();
} catch (Exception e) {
System.out.println("写文件的时候出现了异常");
} finally {
// 或者执行关闭,让他自行写入
try {
bufferedWriter.close();
fileWriter.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

序列化与反序列化

ObjectIn(Out)putStream是序列化操作流的类,用来将Java对象持久化存储在计算机。

  • ObjectOutputStream的Demo,写入对象的过程称为序列化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public class ObjectDemo1 {
    public static void main(String[] args) {
    ArrayList<String> strings = new ArrayList<>();
    strings.add("I'am Linezepore.");
    strings.add("I come from China.");
    strings.add("I love coding.");
    FileOutputStream fileOutputStream = null;
    ObjectOutputStream objectOutputStream = null;
    try {
    fileOutputStream = new FileOutputStream("data/object.txt");
    objectOutputStream = new ObjectOutputStream(fileOutputStream);
    objectOutputStream.writeObject(strings);
    objectOutputStream.flush();
    } catch (FileNotFoundException e) {
    throw new RuntimeException(e);
    } catch (IOException e) {
    throw new RuntimeException(e);
    } finally {
    try {
    fileOutputStream.close();
    objectOutputStream.close();
    } catch (IOException e) {
    System.out.println("流关闭时候出现异常");
    }

    }
    }
    }

  • ObjectInputStream的Demo,将持久化的对象读进程序的过程叫反序列化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class ObjectDemo2 {
    public static void main(String[] args) {
    FileInputStream fileInputStream = null;
    ObjectInputStream objectInputStream = null;
    try {
    fileInputStream = new FileInputStream("data/object.txt");
    objectInputStream = new ObjectInputStream(fileInputStream);
    ArrayList<String> strs = (ArrayList<String>) objectInputStream.readObject();
    System.out.println("strs的第一个元素为:"+strs.get(0));
    } catch (FileNotFoundException e) {
    System.out.println("找不到该文件");
    } catch (IOException e) {
    System.out.println("读文件时候出现了异常");
    } catch (ClassNotFoundException e) {
    throw new RuntimeException(e);
    }
    }
    }

在对自定义的类对象执行序列化之前需要让该类先实现Serializable接口,否则会出现报错:

image-20240307095254118

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ObjectDemo3 {
public static void main(String[] args) {
Student student = new Student();
student.setAge(11);
student.setName("张三");
student.setGender(false);
FileOutputStream fileOutputStream = null;
ObjectOutputStream objectOutputStream = null;
try {
fileOutputStream = new FileOutputStream("data/object_out.txt");
objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(student);
} catch (FileNotFoundException e) {
System.out.println("文件找不到");
} catch (IOException e) {
System.out.println("写文件异常");
e.printStackTrace();
} finally {
try {
fileOutputStream.close();
objectOutputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}

image-20240307135548544

selectOne出现多个数据的问题

image-20240307140032878

日志显示如下:

nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

除了这个错误之外,没有其他的信息了,很头大。我的处理方式是捕获异常之后显性地打印出来,这样的好处是可以帮助我们看到是第几行哪一个方法出现的错误:e.printStackTrace();

然后得到很长很长的冗余信息,我只好把关键性报错的信息丢给GPT,得出结论(信息已脱敏):

堆栈信息中,异常发生在 XXServiceImpl.updateXXStatistics 方法中

之后就是疯狂的看别人的臭长代码时间了,既然问题是出在期望得到一个查询结果的时候却返回了列表,那就到Service的实体类对应的表里看看,果不其然,有两行重复的数据,删掉一行之后,便可以正常分配了。

问题到这其实就解决了,但细究其实还有一个问题:重复的数据是怎么产生的?

XXServiceImpl.updateXXStatistics 这个方法的逻辑是更新统计信息时候,先根据顾问的id和今天这个日期获取统计对象,如果获取不到再插入新的

image-20240307151253496

实在确定不了客户是在哪里分配导致出错的,我就暂且怀疑是判空这里出错了吧:索性加上一句(ObjectUtil.isNotEmpty(todayadminstatics) || todayadminstatics!= null)

写个接口文档

老员工对接的时候没有客户导入的接口文档保存下来,今天要对接接口问题,这锅只能我背/(ㄒoㄒ)/~~

经理让我写一份,我看Knife4j文档里面的参数列表却是没有明确的,崩溃!

image-20240307172841173

我只好把代码丢给GPT,让他帮我列出参数,之后再一个一个检查。

上班好累啊。