- 65.90 KB
- 2022-09-07 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
随堂练习011・FindBugsA・查看FindBugs发现的问题,一共有几类问题,各是什么含义?将这几类问题翻译成中文;答:一共有以下三种类型的问题:1.Bug:InvocationoftoStringoncombinationinsolver.Matrix.niain(String[])ThecodeinvokestoStringonanarray,whichwillgenerateafairlyuselessrcsuItsuchas[C@16f0472.ConsiderusingArrays.toStringtoconvcrtthearrayintoareadableStringthatgivesthecontentsofthearray.中文:在组合代码调用toString数组,这将产生一个相当无用的结果。考虑使用Arrays.toString方法将数组转化成可读的字符串。2.Bug:solver•\1atrix.compute()concatenatesstringsusing+ina1oopThemethodseemstobebuildingaStringusingconcatenationinaloop-Ineachiteration,theStringisconvertedtoaStringBuffer/StringBuilder,appendedto,andconvertedbacktoaString.Thiscanleadtoacostquadraticinthenumberofiterations,asthegrowingstringisrecopicdineachiteration.BetterperformancccanbeobtaincdbyusingaStringBuffcr(orStringBuiIderinJava1.5)explicitly.中文:这个方法似乎是建立在一个循环中使用连接字符串。在每个迭代中,字符串转换为StringBuffer/StringBuilder,附加到,转换回一个字符串。这可能导致成本数量的二次迭代,在每个迭代字符串复制。可以获得更好的性能通过使用StringBuffer显式(或StringBuilderJava1.5中)。3.Bug:Unreadfield:gui.MainWindow.mgameOutput\nThisfieldisneverread.Considerremovingitfromtheclass.中文:gui.MainWindow.mgameOutput这个属性没有被读。这个字段是不会被程序读的。考虑把它从类屮移除。B.如何解决FindBugs指出的问题?请修改Sudoku程序,以改正所有FindBugs指出的问题。注意:同类错误仅需记录一次修改思想即可。答:1.使用Arrays.toString将数组转换为字符串。2.将String类型的该变量定义为StringBuffer类型的,并在循环体中用append()方法替代+操作。3.通过〃查找〃找出对应的属性的所有代码,并注释\删除。(或者调用print方法输出该属性)2・Junit源程序:packagesale;publicclassSaleMachine{privateintcount。fBeer\countOfJuice,count。fFiveCents,countOfOneDollar;privateString[]typeOfGoods={"Beer","Juice"};privateStringresultOfDeal;publicSaleMachine(){initial();}publicvoidinitial(){//默认售货机\ncountOfBeer=3;count。fJuice=3;countOfFiveCents=3;countOfOneDollar=3;publicSaleMachine(intfiveCents,intoneDoUar,intnumOfBeer,intnumOfOrange)〃带参数的初始化售货机{count。fFiveCents=fiveCents;countOfOneDollar=oneDollar;count。fBeer=numOfBeer;count。fJuice=numOfOrange;}publicStringcurrentState(){//返回当前售货机状态Stringstate=”库存\nH+"啤酒:"+countOfBeer+"\nH+“橙汁:”+countOfDuice+”\n”+”五角硬币:”+countOfFiveCents+“\n“+"一元硬币:”+countOfOneDollar;returnstate;}publicStringbuy(Stringtype,intmoney)〃用户购买的方法。type是用户选择的产品,money是用户投币种类{if(money==50)//如果用户投入5角钱{if(type,equals(typeOfGoodsT01))//如果用户选择啤酒{if(countOfBeer>0)//如果还有啤酒{countOcountOfFiveCents++;gsultOfDeal=”请取出饮料”;returnresultofDeal;}else{resultOfDeal=”日前该饮料己经售完”;returnresultofDeal;elseif(type,equals(typeQfGoodsr11))//用户选择橙汁if(countOfDuice>0){count。fJuice\ncountOfFiveCents++;resultOfDeal=*'请取出饮料”;returnresuItOfDeal;}else{resultOfDeal=”目前该饮料已经售完“;returnresuItOfDeal;}}else{resultOfDeal=HH前不提供该饮料”;returnresultOfDeal;}}elseif(money==100)//如果用户投入一元钱{if(countOfFiveCents>0)//如果售货机有零钱{if(type.equals(typeOfGoodsl'0])&&countOfBeer>0)〃如果用户选择啤酒而且还有啤酒{count。fBeer・・;countOfFiveCents・・;couritOfOneDollar++;resultOfDeal=”请取饮料,并取回找钱”;returnresultOfDeal;}elseif(type.equals(typeOfGpodsfl])&&countOf3uice>0)//如果用户选择橙汁而H.还有橙汁{count。fJuicecountOfFiveCentscount。fOneDollar++;resultOfDeal=”请取饮料,并取回找钱”;return「esultOfDeal;elseif(type,equals(typeQfGoodsT01)&&countOfBeer<=0){resultOfDeal=“冃前该饮料己经售完”;returnresultofDeal.;}elseif(tVDe©uals(typeOfGoods」:!])&&countOfJuice<=0){resultOfDeal=“冃前该饮料己经售完”;returnresultofDeal.;}else\n{resultOfDeal二“冃前不提供该饮料“;returnresultofDeal.;}}}else{resultOfDeal=”对不起,目前不能找钱,请投5角硬币";returnresultOfDeal;}}resultOfDeal="请投5角或者1元的硬币”;returnresultOfDeal;\n测试程序以下测试场景均基于上述程序:测试场景:投币1元购买橙汁三次,然后投币1元购买啤酒三次。预期结果:显示“対不起,目前不能找钱,请投5角硬币”函数代码:publicvoidtestNoCoin(){SaleMachinesm=newSaleMachine();assertEquaJs(sn\.buy(/zorange/z,100),〃请取饮料,并取回找钱“);assertEquals^.buy(z,orange,z,100),请取饮料,并取回找钱“);assertEquals{s^.buy(z,orange,z,100),"请取饮料,并取回找钱“);assertEquals{s^buy(,zbeer,z,100),"对不起,目前不能找钱,请投5角硬币〃);}测试结果:通过测试场景:投币1兀,购买可朱预期结果:显示“目前不提供该饮料”函数代码:publicvoidtestColaO{//售货机有5角,投币1元,选择非啤酒非橙汁Sa1cMachinesm=newSaleMachine();assertEquals(s^.buy("Cold",100),目前不提供该饮料");}测试结果:通过\n测试场景:投币5块,购买橙汁预期结果:显示〃请投5角或者1元的硬币〃函数代码:publicvoidtest_500orange(){//售货机没有啤酒剩余,用户投币5角,选择啤酒SaleMachinesm=newSaleMachine();assertEquaLs(sm.buy(^orange*'500),"请投5角或者1元的硬币”);}测试结果:通过测试场景:投币1元购买啤酒一次预期结果:显示“请収饮料,并収回找钱”函数代码:publicvoidtest_50Beer3(){//测试连续买三次啤酒每次投币5角SaleMachinesm=newSaleMachine();assertEquals{s^.buy(z/beer/z,50),请取饮料,并取回找钱");}测试结果:通过测试场景:投币5角购买啤酒四次预期结果:显示“目前该饮料已经售完”函数代码:publicvoidtest_50Beer3(){//测试连续买三次啤酒每次投币5角SaleMachinesm=newSaleMachine();assertEquals^s^i.buy(,zbeerz,,50),"请取出饮料“);assertEquals{s^.buy(,zbeer,z,50),请取出饮料”);assertEquals^svA.buy("beer",50),"请取出饮料〃);assertEquals(sm.buy("beer",50),冃前该饮料己经售完”);}测试结果:通过\n测试场景:初始化五角/一元硬币/啤酒/橙汁都为4个,投币50,购买5次橙汁预期结果:显示“请取岀饮料”*4+〃目前该饮料已经售完〃函数代码:publicvoidtest_500range4(){//售货机没有啤酒剩余,用户投币5角,选择啤酒SaleMachinesm=newSaleMachine(4,4,4,4);assertEqua7s(sm.buy(,zorange/z,50),"请取出饮料");assertEqua(sm.buy("orange",50),"请取岀饮料");assertEquals(sm.buy("orange",50),"请取出饮料");cissertEquals^sm.buy(vorange,z,50),"请取出饮料");assertEquals(沁buy("orange",50),目前该饮料已经售完");}测试结果:通过截图:少JUnitS3Finishedafter0.019secondsRuns:6/6□Errors:0□Failures:0阮sale.STest(RunnerJUnit4J(0.000$):?jtest.50Beer(0.000$)闻test^SOOrange(0.000s)testJOONoCoin(0.000$)知tes^lOOCola(0.000$)gjjte$t-50Orange4(0.000s)"jtest^SOOorange(0.000s