关键词搜索

源码搜索 ×
×

Java经典重现之方法重载导致java.lang.StackOverflowError异常

发布2019-04-17浏览735次

详情内容

由于代码写的不够严谨,经常认为万无一失的地方却出现了重大问题,比如说简单的一个方法重载导致的栈溢出。这种问题已经看到好几次了,虽然代码不是自己写的,还是应该引起重视。

目录

定义接口和实现

错误日志


定义接口和实现

接口:

  1. package com.boonya.stackerror;
  2. public interface Geometry {
  3. /**
  4. * 工作
  5. */
  6. void doWork();
  7. }

实现一:

  1. package com.boonya.stackerror;
  2. public class LineString implements Geometry{
  3. public void doWork() {
  4. // TODO Auto-generated method stub
  5. System.out.println("LineString do work.");
  6. }
  7. }

实现二:

  1. package com.boonya.stackerror;
  2. public class Polygon implements Geometry{
  3. public void doWork() {
  4. // TODO Auto-generated method stub
  5. System.out.println("Ploygon do work.");
  6. }
  7. }

 服务方法多重载:

  1. package com.boonya.stackerror;
  2. public class GeometryService {
  3. /**
  4. * 栈溢出方法
  5. *
  6. * @param geometry
  7. * @param polygon
  8. */
  9. public static void check(LineString geometry,Polygon polygon){
  10. check(geometry, polygon);
  11. }
  12. /**
  13. * 目标方法
  14. * @param geometry
  15. * @param geometry2
  16. */
  17. public static void check(Geometry geometry,Geometry geometry2){
  18. geometry.doWork();
  19. geometry2.doWork();
  20. }
  21. }
  1. package com.boonya.stackerror;
  2. public class GeometryService {
  3. /**
  4. * 栈溢出方法
  5. *
  6. * @param geometry
  7. * @param polygon
  8. */
  9. public static void doWork(LineString geometry,Polygon polygon){
  10. doWork(geometry, polygon);
  11. }
  12. /**
  13. * 目标方法
  14. * @param geometry
  15. * @param geometry2
  16. */
  17. public static void doWork(Geometry geometry,Geometry geometry2){
  18. geometry.doWork();
  19. geometry2.doWork();
  20. }
  21. }

 

测试类:

  1. package com.boonya.stackerror;
  2. public class StackErrorTest {
  3. public static void main(String[] args) {
  4. LineString lineString = new LineString();
  5. Polygon polygon = new Polygon();
  6. GeometryService.check(lineString, polygon);
  7. }
  8. }
  1. package com.boonya.stackerror;
  2. public class StackErrorTest {
  3. public static void main(String[] args) {
  4. LineString lineString = new LineString();
  5. Polygon polygon = new Polygon();
  6. GeometryService.doWork(lineString, polygon);
  7. }
  8. }

 

错误日志

栈溢出的日志会一直打印下去,直到程序被关闭:

  1. Exception in thread "main" java.lang.StackOverflowError
  2. at com.boonya.stackerror.GeometryService.check(GeometryService.java:12)
  3. at com.boonya.stackerror.GeometryService.check(GeometryService.java:12)
  4. at com.boonya.stackerror.GeometryService.check(GeometryService.java:12)
  5. at com.boonya.stackerror.GeometryService.check(GeometryService.java:12)
  6. at com.boonya.stackerror.GeometryService.check(GeometryService.java:12)
  7. at com.boonya.stackerror.GeometryService.check(GeometryService.java:12)
  8. at com.boonya.stackerror.GeometryService.check(GeometryService.java:12)
  9. at com.boonya.stackerror.GeometryService.check(GeometryService.java:12)
  1. Exception in thread "main" java.lang.StackOverflowError
  2. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  3. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  4. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  5. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  6. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  7. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  8. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  9. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  10. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)
  11. at com.boonya.stackerror.GeometryService.doWork(GeometryService.java:12)

 

这样我们就重现了一个栈溢出的情形。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载