java.lang.IllegalArgumentException: Maximum number of fonts was exceeded解决

在使用Apache POI进行Excel导出时遇到字体数量超出限制的问题,通过调整字体创建逻辑成功解决了该问题。

昨晚做数据Excel导出的时候报错,

java.lang.IllegalArgumentException: Maximum number of fonts was exceeded

    at org.apache.poi.hssf.usermodel.HSSFWorkbook.createFont(HSSFWorkbook.java:1068)
    at com.cxah.hfgj.common.util.excel.ExportExcel.exportExcel(ExportExcel.java:160)
    at com.cxah.hfgj.common.util.excel.ExportExcel.exportExcel(ExportExcel.java:52)
    at com.cxah.hfgj.common.util.excel.ExportExcel.excel(ExportExcel.java:214)
    at com.cxah.hfgj.service.imp.SurveyService.derivedExcel(SurveyService.java:143)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at com.sun.proxy.$Proxy76.derivedExcel(Unknown Source)
    at com.cxah.hfgj.web.admin.SurveyAction.edit(SurveyAction.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2517)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2506)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
java.lang.ArrayIndexOutOfBoundsException: -32747
    at java.util.ArrayList.elementData(ArrayList.java:400)
    at java.util.ArrayList.get(ArrayList.java:413)
    at org.apache.poi.hssf.model.WorkbookRecordList.get(WorkbookRecordList.java:50)
    at org.apache.poi.hssf.model.InternalWorkbook.getFontRecordAt(InternalWorkbook.java:481)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.getFontAt(HSSFWorkbook.java:1130)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.createFont(HSSFWorkbook.java:1073)
    at com.cxah.hfgj.common.util.excel.ExportExcel.exportExcel(ExportExcel.java:160)
    at com.cxah.hfgj.common.util.excel.ExportExcel.exportExcel(ExportExcel.java:52)
    at com.cxah.hfgj.common.util.excel.ExportExcel.excel(ExportExcel.java:214)
    at com.cxah.hfgj.service.imp.SurveyService.derivedExcel(SurveyService.java:143)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)

    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at com.sun.proxy.$Proxy76.derivedExcel(Unknown Source)
    at com.cxah.hfgj.web.admin.SurveyAction.edit(SurveyAction.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)

    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)

    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

网上查了一下

因为当时导出的记录,每条记录中汉字比较多。

HSSFFont font3 = workbook.createFont();
 font3.setColor(HSSFColor.BLUE.index);

这两句写在循环体中,没循环都要重新生成一次,结果炸了。这两句拿出来丢到循环外面,需要的时候直接调用就好了

果然问题解决

### Java中因参数数量错误导致的 `IllegalArgumentException` 问题及其解决方案 当在Java中调用方法时,如果传递的参数数量与方法签名不匹配,则会抛出 `java.lang.IllegalArgumentException: wrong number of arguments` 异常。此异常通常发生在通过反射机制调用方法时,例如使用 `Class.getMethod()` 或 `Method.invoke()` 方法。 以下是解决问题的详细步骤和建议: 1. **检查方法签名** 在调用方法之前,确保目标方法的签名(包括参数类型和数量)与实际传递的参数一致。可以通过 `Class.getMethod(String name, Class<?>... parameterTypes)` 来获取方法对象,并验证其参数列表是否正确[^1]。 2. **验证参数数量和类型** 使用反射调用方法时,必须确保传递的参数数量和类型与方法签名完全匹配。如果不匹配,将抛出 `IllegalArgumentException`。例如: ```java try { Method method = MyClass.class.getMethod("find", Integer.class); method.invoke(new MyClass(), 42); // 正确调用 } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } ``` 3. **处理泛型集合中的类型不兼容问题** 如果涉及泛型集合操作,需特别注意传递的参数类型是否与集合的泛型参数兼容。如果参数类型不匹配,可能导致意外行为或异常[^2]。例如: ```java List<String> list = new ArrayList<>(); list.add("Hello"); if (!list.contains(42)) { // 错误:传递了非String类型的参数 System.out.println("Not found"); } ``` 4. **避免混淆的异常命名** 如果自定义异常类以“Exception”结尾但未继承自其他异常类,可能会引起混淆。建议遵循标准命名约定,以减少用户误解[^4]。 5. **实现正确的 `compareTo` 和 `equals` 方法** 如果类实现了 `Comparable` 接口,需确保 `compareTo` 方法的行为与 `equals` 方法一致。否则,可能在使用某些集合类(如 `PriorityQueue`)时引发不可预测的问题[^3]。 6. **捕获并处理异常** 在反射调用中,始终捕获并处理可能的异常(如 `NoSuchMethodException`、`IllegalAccessException` 和 `InvocationTargetException`),以便程序能够优雅地处理错误情况。 ### 示例代码 以下是一个完整的示例,展示如何正确使用反射调用方法并处理参数数量错误的情况: ```java import java.lang.reflect.Method; public class MethodTrouble { public void find(Integer value) { System.out.println("Found: " + value); } public static void main(String[] args) { try { MethodTrouble obj = new MethodTrouble(); Method method = MethodTrouble.class.getMethod("find", Integer.class); // 正确调用 method.invoke(obj, 42); // 错误调用:参数数量不匹配 try { method.invoke(obj); // 抛出 IllegalArgumentException } catch (IllegalArgumentException e) { System.err.println("Error: " + e.getMessage()); } } catch (Exception e) { e.printStackTrace(); } } } ``` #### 输出结果 ``` Found: 42 Error: wrong number of arguments ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值