虽然以前接触过java,也写过一些1000行左右的程序。能够说面向对象的思想和java的一些基本语法对我来讲是没有难度的,可是这学期的面向对象依然给了我一个下马威。这几回的做业每次都很让我头疼。由于不只要保证针对正确的输入要反馈出正确的输出,还要把错误的输入分辨出来。这样一来,譬如正则表达式和异常处理等新知识和小细节的不熟悉就会让每一次做业变成让人头疼的对象。java
其实抽象出来,咱们如今完成的三个小任务,每个均可以抽象成三个步骤。正则表达式
我将逐次分析个人三次做业失误出如今哪一个步骤。算法
类图数组
第一次做业的算法实现仍是很简单的,在没有时间复杂度限制的状况下,计算的时候只须要遍历两个须要计算的多项式,把次数相同的项的系数相加减,而后去除系数为0的项。最后输出获得的多项式就能够。那么问题主要出如今第一个步骤。多线程
由于咱们的多项式输入时以字符串的方式输入,并且格式十分复杂,为了防止正则表达式匹配时爆栈。我只好采用分阶段逐次匹配的模式。就是先看字符串是否是知足最基本的几个式子加减的形式。若是知足,看进行加减的式子是否是知足多项式的形式。若是知足,看多项式的每一项是否知足指导书中对系数项数的规定。只有这三个层次都知足的状况下才能算做是知足输入的要求。并且在检查格式的时候天然用到了多项式格式的划分,下一步提取成分也就是天然而然的结果了。函数
个人问题主要出如今在分层次的过程当中对格式的检查不太熟练,包括正则和java的字符串函数,在这个过程当中忙于拆东补西,产生了可观的bug。并且第一次做业也对指导书的重要性认识不够。忽略了指导书上明确提出须要知足的要求,好比先导零和最多50项等等。线程
第二次做业是我完成的最满意的一次做业。读指导书,写伪代码和算法,写了满满两张纸(惋惜纸由于被我涂涂抹抹的太乱了给扔了。。。)。3d
因为细心的准备,一二三步骤我都完成的不错。可是此次做业我犯了一个能够说是只有计算机系同窗才会犯的错误。那就是大楼的层数是从一开始算的,但我在写算法和敲代码的过程当中都很天然的认为大楼的层数是从零开始的,毕竟平时从零开始的时候太多了。而后是电梯的状态转移,我定义了一个Stage类用来表示电梯的状态,而后用Stage的数组来保存电梯从一开始的状态变化历史。包括执行请求更新状态和查询某条请求是否无效,都经过对这个状态数组的操做实现,虽然算法没问题,因为本身的考虑不周到,在代码实现的时候,在某些指令上下搜索状态的状况下会产生数组越界错误。这个反映了我另外一个薄弱的知识点,那就是对抛出异常方法掌握的不熟练。对象
顺便说一句,第三次做业是我惟一一次在互测中找出别人bug来的做业,由于本身的基础不怎么好,分到的做业又几乎都是AK了全部的公测点,因此互测找bug找的很辛苦。每次找bug的时候基本都是尽力去看别人的源代码,而后尝试有目的地去爆破错误。这一次的bug应该是对方对java中的大数类不熟练形成的。在判断一个字符串是不是数字(4字节)的时候,个人思路是先判断是否是整数,而后直接转化成bigDecimal类与那个最大的数字4294967295进行比较。那位同窗判断整数以后,就开始先比较位数,而后在一位一位的开始与4294967295比较(常见的C语言风格),这样就形成了有先导零的时候字符串位数大而产生的判断失误。bug+1!blog
这一次做业的失误彻底是第三步算法的失误,在改正了第二次的好笑bug后,公测互测都没有找出格式方面的bug。由于第三次做业几乎继承了第二次做业的绝大多数内容。因此我本想在第二次的基础上进行修改,而后发现由于请求不必定按照发出请求的顺序执行的特色几乎和个人状态数组更新的方法彻底冲突,而后就是无休止的出bug改bug,做业量超出了个人预计,直到ddl也没有彻底改正,因此公测报了一堆bug。直到截至以后我才反应过来,不该该迷信继承的方法,应该直接从新实现和第三次指导书兼容的调度方法。算是痛定思痛吧,截至这篇文章发表前,结合多线程的指导书,第三次的坑已经基本填完,期待下一次的表现。
但愿助教或者其余大神能发一篇异常try-catch的教程,这方面自学看书看的迷迷糊糊的,几乎不敢使用,只能靠if-else维持程序的正常运行。感受并无发挥java这门语言的特性。若是能有这样的教程的话,必定会点100个赞的。