大作业心得记录及错误分析

本文记录了Java Socket编程中遇到的各种问题及其解决方案,包括空指针异常、内部类使用、界面切换、序列化异常等,并分享了一些实用的小技巧。

写到迭代三了,前面的代码逻辑写的不够好,复用代码是件很头痛的事情,socket编程也出现了各种奇葩的错误

挖个坑记录一下出现的错误和解决方案,以及用到的一些小技巧。

1.空指针异常 NullPointerException

 比较常见的错误。经常由于只声明了引用,而没有新建对象给引用造成。用ArrayList时经常出现

2.main方法中不能新建内部类的对象

解决方法:新建一个其他方法调用,main中调用该方法

3.Socket发送写到自建的send()方法里

4.setContentPane() 多个JPanel类, 可以轻松实现多个界面跳转,个人感觉比cardLayout好用

5.把命令封装在不同的xxxCmd类中,xxxCmd实现接口Command,接口Command:excute(); 各自实现

6.EOF异常

7.

setOpaque(true);设置控件不透明
setOpaque(false);设置控件透明

8.java.io.InvalidClassException异常

java.io.InvalidClassException: server.CourseSystem; local class incompatible: stream classdesc serialVersionUID = 6006469664506583150, local class serialVersionUID = 5860300662680845999
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:604)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at helper.SocketHelper.deSerialization(SocketHelper.java:113)
at server.Server$Start.run(Server.java:119)
at java.lang.Thread.run(Thread.java:722)

解决方案:

 a.将本地的序列化的类中的版本号(serialVersionUID )改成和远程中一样

b.重新建了项目,拷贝过去。。居然也可以


9.依然是序列化错误。java.io.NotSerializableException:

查询资料:

序列化对类的处理原则

并不是一个实现了序列化接口的类的所有字段及属性都是可以序列化的。分为以下几个部分来说明:

1、 如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可序列化接口。则其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可序列化接口,则该类的父类所有的字段属性将不会序列化。

2、如果该类的某个属性标识为static类型的,则该属性不能序列化;

3、如果该类的某个属性采用transient关键字标识,则该属性不能序列化;

需要注意的是,在我们标注一个类可以序列化的时候,其以下属性应该设置为transient

来避免序列化:

(1) 线程相关的属性;

(2) 需要访问IO、本地资源、网络资源等的属性;

(3) 没有实现可序列化接口的属性;(注:如果一个属性没有实现可序列化,而我们又没有将其用

    transient 标识, 则在对象序列化的时候, 会抛出java.io.NotSerializableException 异常)。 构造函数和序列化

4、对于父类的处理,如果父类没有实现序列化接口,则其必须有默认的构造函数(即没有参数的构造函数)如果没有给父类一个默认构造函数,则编译的时候就会报错。在反序列化的时候,如果父类也是可序列化的话,则其默认构造函数也不会 调用。Java 对序列化的对象进行反序列化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成,毕竟我们的可序列化的类可能有多个构造函数,如果我们的可序列化的类没有默认的构造函数,反序列化机制并不知道要调用哪个构造函数才是正确的。

serialVersionUID作用

java在序列化的时候涉及到很多检查,serialVersionUID就是其中一个。 

那这个serialVersionUID有什么用处? 

这个值可以由类指定,也可以不指定。如果不指定的话java会根据class计算serialVersionUID,相当于hash的原理(但不是hash不要混淆),只要类没有变化,计算出来的serialVersionUID也会变化。 

它用在反序列化的时候“检查”当前的类是不是已经被修改过。如果发现serialVersionUID对不上号,那么会抛出 java.io.InvalidClassException的异常,这种情况发生在由于种种因素修改了序列化对象的类文件时。 

但是有时候我们有这样的需求,将A类对象序列化之后,版本升级,修改了A类,这时候,希望反序列化的时候还能认识之前版本的序列化对象。这时候serialVersionUID就在笑了,对,只要指定序列化对象类的serialVersionUID就可以了。 

指定了序列化对象的serialVersionUID,即使你删除了类的某个成员变量,其他未修改信息仍然能正确解析,对他就是这么变态。

Java 的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的 serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
  当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量 时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的 class才会生成相同的serialVersionUID 。
  如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。

最后处理方法:把实现了serializable接口中,不可序列化的加了transient

10.推选课程后,表中信息不能立刻消失。。。还未解决

11.各种奇葩的空指针异常QAQ不能忍啊哭

12.又出现了新问题:选课后,再退出重登陆,在学生选课列表里课程会消失,但是课程仍然持有该学生。。为什么会消失(已解决

13.检查功能是否完备

14.发现问题:当教师修改课程信息后,学生已选择的课程信息不会随之更新




还需要完善的功能

  1. 选课时确保不重复
  2. 对老师和学生列表的维护中,是否需要删除功能
  3. 老师的查看课程分为查看自己的课程和全部课程
  4. 修改课程时只能改自己的课程,否则提示受限




该数据集通过合成方式模拟了多种发动机在运行过程中的传感器监测数据,旨在构建一个用于机械系统故障检测的基准资源,特别适用于汽车领域的诊断分析。数据按固定时间间隔采集,涵盖了发动机性能指标、异常状态以及工作模式等多维度信息。 时间戳:数据类型为日期时间,记录了每个数据点的采集时刻。序列起始于2024年12月24日10:00,并以5分钟为间隔持续生成,体现了对发动机运行状态的连续监测。 温度(摄氏度):以浮点数形式记录发动机的温度读数。其数值范围通常处于60至120摄氏度之间,反映了发动机在常规工况下的典型温度区间。 转速(转/分钟):以浮点数表示发动机曲轴的旋转速度。该参数在1000至4000转/分钟的范围内随机生成,符合多数发动机在正常运转时的转速特征。 燃油效率(公里/升):浮点型变量,用于衡量发动机的燃料利用效能,即每升燃料所能支持的行驶里程。其取值范围设定在15至30公里/升之间。 振动_X、振动_Y、振动_Z:这三个浮点数列分别记录了发动机在三维空间坐标系中各轴向的振动强度。测量值标准化至0到1的标度,较高的数值通常暗示存在异常振动,可能与潜在的机械故障相关。 扭矩(牛·米):以浮点数表征发动机输出的旋转力矩,数值区间为50至200牛·米,体现了发动机的负载能力。 功率输出(千瓦):浮点型变量,描述发动机单位时间内做功的速率,取值范围为20至100千瓦。 故障状态:整型分类变量,用于标识发动机的异常程度,共分为四个等级:0代表正常状态,1表示轻微故障,2对应中等故障,3指示严重故障。该列作为分类任务的目标变量,支持基于传感器数据预测故障等级。 运行模式:字符串类型变量,描述发动机当前的工作状态,主要包括:怠速(发动机运转但无负载)、巡航(发动机在常规负载下平稳运行)、重载(发动机承受高负荷或高压工况)。 数据集整体包含1000条记录,每条记录对应特定时刻的发动机性能快照。其中故障状态涵盖从正常到严重故障的四级分类,有助于训练模型实现故障预测与诊断。所有数据均为合成生成,旨在模拟真实的发动机性能变化与典型故障场景,所包含的温度、转速、燃油效率、振动、扭矩及功率输出等关键传感指标,均为影响发动机故障判定的重要因素。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值