java.lang.IllegalStateException异常产生的原因及解决办法

  • 异常一:java.lang.IllegalStateException:Cannot   forward   a   response   that   is   already   committed 
    异常二:IllegalStateException:response already commited 
    异常三:IllegalStateException:getOutputStream() has already been called for this request

前言:

  response是服务端对客户端请求的一个响应,其中封装了响应头、状态码、内容(也就是最终要在浏览器上显示的HTML代码或者其他数据格式)等,

  服务端在把response提交到客户端之前,会使用一个缓冲区,并向该缓冲区内写入响应头和状态码,然后将所有内容flush(flush包含两个步骤:先将缓冲区内容发送至客户端,然后将缓冲区清空)。这就标志着该次响应已经committed(提交)。对于当前页面中已经committed(提交)的response,就不能再使用这个response向缓冲区写任何东西  (注:以为JSP中,response是一个JSP页面的内置对象,所以同一个页面中的response.XXX()是同一个response的不同方法,只要其中一个已经导致了committed,那么其它类似方式的调用都会导致 IllegalStateException异常)。

 

对于异常一:

问题描述

在执行一段代码后,最后执行request.getRequestDispatcher(跳转页面URL).forward(resquest,response)进行页面跳转时,报了此错

问题原因

1.在forwar之前,response就已经commit到浏览器端了。

导致response commit的原因包括:forward, redirect, flushBuffer

2.前两个原因都是指在forward之前就已经进行了页面跳转动作(forward, redirect)。

于flushBuffer,每一个JSP页面都有一个缓冲区,默认的缓冲区大小为8KB,如果缓冲区被占满的话,web服务器就会自动将response 进行commit,然后清空缓冲区(即flush),所以再进行页面跳转的时候就会报response已经被commit了。

内置对象out相关方法

public abstract void clear() throws java.io.IOException清除缓冲区中的内容。如果缓冲区已经被刷新,clear()方法将抛出IOException异常
public abstract void clearBuffer() throws java.io.IOException清除缓冲区中的当前内容。这个方法和clear()方法的区别是,如果缓冲区已经被刷新,这个方法不会抛出IOException异常
public abstract void close() throws java.io.IOException

刷新缓冲区,关闭输出流。注意,我们在编写JSP页面时,不需要显式地去调用这个方法,因为在JSP容器所生成的代码中会自动包含对close()方法的调用。

public abstract void flush() throws java.io.IOException刷新缓冲区,两个步骤:1,提交response  2.清空缓冲区
public int getBufferSize()获得缓冲区大小,同response.getBufferSize()相同
public abstract int getRemaining()获得缓冲区中未使用的字节数
public boolean isAutoFlush()判断out对象是否是自动刷新 
<%@ page autoFlush="true" %> <%--Default--%>

内置对象response相关方法

response.isCommitted()确认response是否已经committed
response.flushbuffer();同out.flush相同

 

解决方法:

增大缓冲区大小:     

<%@ page buffer="10kb" %>

参考:http://jorton468.blog.163.com/blog/static/72588135201102441617287/

`java.lang.IllegalStateException` 是一个运行时异常,通常发生在代码尝试在不合适的时间调用某个方法或操作。以下是几种可能导致该异常的情况和解决方法: 1. 操作状态错误:当尝试在未准备好的状态下执行某个操作时,将抛出 `IllegalStateException`。例如,在视图还没有完成布局之前尝试访问视图的大小或位置。解决方法是确保在执行任何操作之前,所有必要的资源都已准备好,如使用 `View.post()` 方法在视图完成布局后再进行操作。 2. 资源已释放:当尝试使用已经被释放的资源或对象时,将抛出 `IllegalStateException`。例如,在使用已经关闭的数据库连接或已经释放的线程池执行任务时,都会导致该异常。解决方法是确保资源在使用之前都处于可用状态,并且在使用后及时释放资源。 3. 状态转换错误:当尝试从一个状态转换到另一个状态时,如果状态转换不合法,则会抛出 `IllegalStateException`。例如,在 `MediaPlayer` 对象还没有准备好时尝试播放音频文件,将抛出该异常。解决方法是确保在进行状态转换之前,所有必要的操作和条件都已满足。 4. 数据格式错误:当尝试使用不正确的数据格式或类型时,将抛出 `IllegalStateException`。例如,在尝试将一个非数字字符串转换为数字时,将抛出该异常。解决方法是确保使用正确的数据格式和类型进行操作,并进行必要的数据类型转换。 总之,要避免 `IllegalStateException` 异常,需要仔细检查代码中所有操作的前提条件和后置条件,并确保在进行任何操作之前,所有必要的资源和条件都已准备好。同时,需要合理地处理异常情况,以避免程序崩溃或出现不可预期的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值