问题描述
rtimportjava.util.*;classShape{publicvoiddraw(){}publicvoiderase(){}}classCircleextendsShape{publicvoiddraw(){System.out.println("Circle.draw()");}publicvoiderase(){System.out.println("Circle.erase()");}}classSquareextendsShape{publicvoiddraw(){System.out.println("Square.draw()");}publicvoiderase(){System.out.println("Square.erase()");}}classTriangleextendsShape{publicvoiddraw(){System.out.println("Triangle.draw()");}publicvoiderase(){System.out.println("Triangle.erase()");}}classRandomShapeGenerator{privateRandomrand=newRandom(47);publicShapenext(){switch(rand.nextInt(3)){default:case0:returnnewCircle();case1:returnnewSquare();case2:returnnewTriangle();}}}publicclasstest/*extendsA*/{privatestaticRandomShapeGeneratorgen=newRandomShapeGenerator();publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubShape[]s=newShape[3];for(inti=0;i<s.length;i++){s[i]=gen.next();for(Shapeshp:s){shp.draw();}}}}
报错:Exceptioninthread"main"java.lang.NullPointerExceptionatj2se.test.main(test.java:81)第81行即:shp.draw();这行我是新手,刚学java的,望指教,谢谢!
解决方案
解决方案二:
for(inti=0;i<s.length;i++){s[i]=gen.next();for(Shapeshp:s){shp.draw();}}
这两层循环有些冗余for(inti=0;i<s.length;i++){for循环就是想遍历数组sfor(Shapeshp:s){for-each循环也是遍历数组s楼主的空指针问题出在Shape[]s=newShape[3];楼主只初始化了长度为3的Shape型的数组,但是却没有给s[i]挨个赋值,即没有给数组元素指向对象的引用所以shp都是null,再调用draw就空指针了
解决方案三:
参考楼上吧。/
解决方案四:
引用2楼rui888的回复:
参考楼上吧。/
哈喽,放假了吗?我还在上班中啊
解决方案五:
我的看法是switchcase中default应该放在最后
解决方案六:
引用3楼magi1201的回复:
Quote: 引用2楼rui888的回复:
参考楼上吧。/哈喽,放假了吗?我还在上班中啊
还没,国家法定,还得到明天晚上。
解决方案七:
把main函数改成这样就行了,你循环2次了publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubShape[]s=newShape[3];for(inti=0;i<s.length;i++){gen.next().draw();}}
解决方案八:
参考一楼吧。
解决方案九:
一楼是正确的。Shape[]s=newShape[3];//定义未初始化for(inti=0;i<s.length;i++){s[i]=gen.next();//初始化一个for(Shapeshp:s){shp.draw();//第一次遍历的时候只有s[0],初始化,其他的都没有}