解决:java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

程序做着做着IDEA报错:
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
在response提交之后不能发送错误请求。

出现原因:

  • 重复调用sendRedirect方法
    – 这个可能是代码中有多个逻辑判断跳转,程序执行完一个跳转马上执行下一个跳转。
    对此我们要在执行完后立即return。
  • 在调用方法之前输出流被关闭了
    – 这种问题就是我出现的,也是最常出现的。就是在使用完out对象输出后,调用close()关闭
    解决办法:在调用close之后的return改为return null;
  • 在调用方法之前输出刷新了
    – 在使用完out对象输出后,调用flush()刷新

最后网上搜索后,还有一种情况:

还有一种比较特殊的情况,属于第三种
在JSP页面编码时出现的错误,JSP页面中有很多HTML内容,我在结尾处使用了response.sendRedirect()后报错。单代码本身是没有问题的,后来找了半天发现,如果把HTML代码减少一些,就不会报错。
最后总结原因就是因为JSP翻译为Servlet后,所有HTML代码都是通过JspWrite对象的write方法打印输出的,JspWriter与PrintWrite都继承自java.io.Writer ,在调用write()方法写入的时候是写入到缓冲区,当缓冲区满的时候就会自动刷新输出。所以刷新输出后,再调用response.sendRedirect()就会报错了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值