在java中常出现的异常和解决方法?
1. java.lang.nullpointerexception\x0d\x0a 这个异常大家肯定都经常遇到,异常的解释是”程序遇上了空指针”,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)\x0d\x0a\x0d\x0a 2. java.lang.classnotfoundexception\x0d\x0a 这个异常是很多原本在jb等开发环境中开发的程序员,把jb下的程序包放在wtk下编译经常出现的问题,异常的解释是”指定的类不存在”,这里主要考虑一下类的名称和路径是否正确即可,如果是在jb下做的程序包,一般都是默认加上package的,所以转到wtk下后要注意把package的路径加上。\x0d\x0a\x0d\x0a 3. java.lang.arithmeticexception\x0d\x0a 这个异常的解释是”数学运算异常”,比如程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。\x0d\x0a\x0d\x0a 4. java.lang.arrayindexoutofboundsexception\x0d\x0a 这个异常相信很多朋友也经常遇到过,异常的解释是”数组下标越界”,现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。\x0d\x0a\x0d\x0a 5. java.lang.illegalargumentexception\x0d\x0a 这个异常的解释是”方法的参数错误”,很多j2me的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数如果写成负数就会出现这个异常,再比如g.setcolor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。\x0d\x0a\x0d\x0a 6. java.lang.illegalaccessexception\x0d\x0a 这个异常的解释是”没有访问权限”,当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了package的情况下要注意这个异常。\x0d\x0a\x0d\x0a 其他还有很多异常,我就不一一列举了,我要说明的是,一个合格的程序员,需要对程序中常见的问题有相当的了解和相应的解决办法,否则仅仅停留在写程序而不会改程序的话,会极大影响到自己的开发的。关于异常的全部说明,在api里都可以查阅。\x0d\x0a\x0d\x0a算术异常类:ArithmeticExecption\x0d\x0a\x0d\x0a空指针异常类:NullPointerException\x0d\x0a\x0d\x0a类型强制转换异常:ClassCastException\x0d\x0a\x0d\x0a数组负下标异常:NegativeArrayException\x0d\x0a\x0d\x0a数组下标越界异常:ArrayIndexOutOfBoundsException\x0d\x0a\x0d\x0a违背安全原则异常:SecturityException\x0d\x0a\x0d\x0a文件已结束异常:EOFException\x0d\x0a\x0d\x0a文件未找到异常:FileNotFoundException\x0d\x0a\x0d\x0a字符串转换为数字异常:NumberFormatException\x0d\x0a\x0d\x0a操作数据库异常:SQLException\x0d\x0a\x0d\x0a输入输出异常:IOException\x0d\x0a\x0d\x0a方法未找到异常:NoSuchMethodException\x0d\x0a\x0d\x0ajava.lang.AbstractMethodError\x0d\x0a\x0d\x0a抽象方法错误。当应用试图调用抽象方法时抛出。\x0d\x0a\x0d\x0ajava.lang.AssertionError\x0d\x0a\x0d\x0a断言错。用来指示一个断言失败的情况。\x0d\x0a\x0d\x0ajava.lang.ClassCircularityError\x0d\x0a\x0d\x0a类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。\x0d\x0a\x0d\x0ajava.lang.ClassFormatError\x0d\x0a\x0d\x0a类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。\x0d\x0a\x0d\x0ajava.lang.Error\x0d\x0a\x0d\x0a错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。\x0d\x0a\x0d\x0ajava.lang.ExceptionInInitializerError\x0d\x0a\x0d\x0a初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。\x0d\x0a\x0d\x0ajava.lang.IllegalAccessError\x0d\x0a\x0d\x0a违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。\x0d\x0a\x0d\x0ajava.lang.IncompatibleClassChangeError\x0d\x0a\x0d\x0a不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。\x0d\x0a\x0d\x0ajava.lang.InstantiationError\x0d\x0a\x0d\x0a实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.\x0d\x0a\x0d\x0ajava.lang.InternalError\x0d\x0a\x0d\x0a内部错误。用于指示Java虚拟机发生了内部错误。\x0d\x0a\x0d\x0ajava.lang.LinkageError\x0d\x0a\x0d\x0a链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。\x0d\x0a\x0d\x0ajava.lang.NoClassDefFoundError\x0d\x0a\x0d\x0a未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。\x0d\x0a\x0d\x0ajava.lang.NoSuchFieldError\x0d\x0a\x0d\x0a域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。\x0d\x0a\x0d\x0ajava.lang.NoSuchMethodError\x0d\x0a\x0d\x0a方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。\x0d\x0a\x0d\x0ajava.lang.OutOfMemoryError\x0d\x0a\x0d\x0a内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。\x0d\x0a\x0d\x0ajava.lang.StackOverflowError\x0d\x0a\x0d\x0a堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。\x0d\x0a\x0d\x0ajava.lang.ThreadDeath\x0d\x0a\x0d\x0a线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。\x0d\x0a\x0d\x0ajava.lang.UnknownError\x0d\x0a\x0d\x0a未知错误。用于指示Java虚拟机发生了未知严重错误的情况。\x0d\x0a\x0d\x0ajava.lang.UnsatisfiedLinkError\x0d\x0a\x0d\x0a未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。\x0d\x0a\x0d\x0ajava.lang.UnsupportedClassVersionError\x0d\x0a\x0d\x0a不支持的类版本错误。当Java虚拟机试图从读取某个类文件,但是发现该文件的主、次版本号不被当前Java虚拟机支持的时候,抛出该错误。\x0d\x0a\x0d\x0ajava.lang.VerifyError\x0d\x0a\x0d\x0a验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。\x0d\x0a\x0d\x0ajava.lang.VirtualMachineError\x0d\x0a\x0d\x0a虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。\x0d\x0a\x0d\x0ajava.lang.ArithmeticException\x0d\x0a\x0d\x0a算术条件异常。譬如:整数除零等。\x0d\x0a\x0d\x0ajava.lang.ArrayIndexOutOfBoundsException\x0d\x0a\x0d\x0a数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。\x0d\x0a\x0d\x0ajava.lang.ArrayStoreException\x0d\x0a\x0d\x0a数组存储异常。当向数组中存放非数组声明类型对象时抛出。\x0d\x0a\x0d\x0ajava.lang.ClassCastException\x0d\x0a\x0d\x0a类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。\x0d\x0a\x0d\x0ajava.lang.ClassNotFoundException\x0d\x0a\x0d\x0a找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。\x0d\x0a\x0d\x0ajava.lang.CloneNotSupportedException\x0d\x0a\x0d\x0a不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。\x0d\x0a\x0d\x0ajava.lang.EnumConstantNotPresentException\x0d\x0a\x0d\x0a枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。\x0d\x0a\x0d\x0ajava.lang.Exception\x0d\x0a\x0d\x0a根异常。用以描述应用程序希望捕获的情况。\x0d\x0a\x0d\x0ajava.lang.IllegalAccessException\x0d\x0a\x0d\x0a违法的访问异常。当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。\x0d\x0a\x0d\x0ajava.lang.IllegalMonitorStateException\x0d\x0a\x0d\x0a违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。\x0d\x0a\x0d\x0ajava.lang.IllegalStateException\x0d\x0a\x0d\x0a违法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时,抛出该异常。\x0d\x0a\x0d\x0ajava.lang.IllegalThreadStateException\x0d\x0a\x0d\x0a违法的线程状态异常。当县城尚未处于某个方法的合法调用状态,而调用了该方法时,抛出异常。\x0d\x0a\x0d\x0ajava.lang.IndexOutOfBoundsException\x0d\x0a\x0d\x0a索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。\x0d\x0a\x0d\x0ajava.lang.InstantiationException\x0d\x0a\x0d\x0a实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。\x0d\x0a\x0d\x0ajava.lang.InterruptedException\x0d\x0a\x0d\x0a被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。\x0d\x0a\x0d\x0ajava.lang.NegativeArraySizeException\x0d\x0a\x0d\x0a数组大小为负值异常。当使用负数大小值创建数组时抛出该异常。\x0d\x0a\x0d\x0ajava.lang.NoSuchFieldException\x0d\x0a\x0d\x0a属性不存在异常。当访问某个类的不存在的属性时抛出该异常。\x0d\x0a\x0d\x0ajava.lang.NoSuchMethodException\x0d\x0a\x0d\x0a方法不存在异常。当访问某个类的不存在的方法时抛出该异常。\x0d\x0a\x0d\x0ajava.lang.NullPointerException\x0d\x0a\x0d\x0a空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。\x0d\x0a\x0d\x0ajava.lang.NumberFormatException\x0d\x0a\x0d\x0a数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。\x0d\x0a\x0d\x0ajava.lang.RuntimeException\x0d\x0a\x0d\x0a运行时异常。是所有Java虚拟机正常操作期间可以被抛出的异常的父类。\x0d\x0a\x0d\x0ajava.lang.SecurityException\x0d\x0a\x0d\x0a安全异常。由安全管理器抛出,用于指示违反安全情况的异常。\x0d\x0a\x0d\x0ajava.lang.StringIndexOutOfBoundsException\x0d\x0a\x0d\x0a字符串索引越界异常。当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。\x0d\x0a\x0d\x0ajava.lang.TypeNotPresentException\x0d\x0a\x0d\x0a类型不存在异常。当应用试图
Retrofit2.0+RxJava网络请求异常统一处理
本文内容是基于RxJava 2.0及Retrofit 2.1分析的。参考了 Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,统一对有无网络处理, 异常处理,返回结果问题
下面列出具体添加的依赖。
以下这些错误,都是在网络请求中经常见的。我们可以通过Toast弹出消息通知用户具体的异常以及加载对应的UI界面。除此之外,通过具体的异常信息,方便我们及时的排查项目中的BUG。
那么问题就来了,我们如何判断异常的类型?
这就要从服务器返回的数据格式说起了。
我们一般请求的返回都是像下面这样
服务器端返回数据约定俗称就是大概以上的格式。可能具体的code码表示的含义不一样,这个可以与服务器端人员交流,灵活变化。
关于Retrofit的基本配置就不再讲述了,这里具体讲解如何对服务器返回数据封装以及使用RxJava对错误信息处理。
封装返回数据
对于上述的服务器返回数据我们要对code做出一些判断,code不为200(假设200表示请求网络成功)就抛出异常。所以我们新建一个BaseResponse类,对应上面的数据结构。
这算是所有实体的一个基类,data可以为任何数据类型。
然后要对返回结果进行预处理,新建一个ExceptionHandle。预处理无非就是当根据返回数据BaseResponse的isOk()方法判断为是否为true,若为true则正常处理,否则抛出异常让ExceptionHandle进一步处理,判断异常为何种异常。我们先跳过前面的逻辑,先了解如何判断是何种异常?
判断异常类型
详细可看源码,下面会贴出地址。
通过ExceptionHandle.handleException(Throwable e) 即可返回一个异常,并携带具体异常类型信息。
现在我们已经知道了如何判断是否产生以上以及如何判断异常类型。接下来需要解决地就是如何把异常传递给Observer的onError(Throwable e)去处理异常。
在进行异常传递的过程中,第一步我们先要判断服务器返回的数据是否是异常,如果不是异常则返回data数据,如果是异常则抛出异常。这个时候就包含了一个数据转换的过程即把BaseResponse对象转换成data类型的对象,所以需要map()操作符。
其中HandleFuc实现了 FunctionBaseResponseT, T 接口
如果不出现异常则不会走第二步。如果出现异常,则需要进行第二步,即对异常进行判断,然后将ExceptionHandle.handleException(Throwable e) 返回的异常传入onError()中处理。
重点来了:当产生异常时,应该终止对onNext()方法的调用并调用onError()方法。如果不继续处理,仅通过以上步骤,虽然会调用onError()方法,但是没有对异常进行判断,并且没有取消onNext()方法。那么有没有一个好的方法,可以即取消onNext()方法,又能在其中实现异常判断的执行,并且会调用onError()方法?
如此强大的RxJava自然有这样的方法了, onErrorResumeNext() 就能实现这个要求。对于 onErrorResumeNext() ,可以简单理解为:当发生错误的时候,由另外一个Observable来代替当前的Observable并继续发射数据。
onErrorResumeNext() 中传入的参数可以是一个Function接口。这样,我们可以在Function中生成一个Observable,该Observable执行异常判断的逻辑,并调用onError()方法。
具体实现如下:
至此,我们便实现了异常判断与传递的逻辑。这样我们就可以在onError()方法中提取具体的异常状态信息,进行相应的处理。
大概流程是:map()进行数据类型转换,并检测异常。如果正常,返回data类型的数据。如果不正常,onErrorResumeNext()判断异常类型并传递异常
上述情况关闭了网络。当发起网络请求,没有网络则抛出异常,然后检测出具体异常,Toast提示异常类型,用户便知道是什么地方出错了。
demo参考地址:
java编程,创建两个异常,传递相应得字符串作为错误提示参数给两个异常的构造器
不受检异常:
一般情况下 Error 和 RuntimeException 的子类所描述的错误和运行时异常都是 Unchecked Exception,即对有可能抛出这些错误或运行时异常的代码段可以作异常捕获处理或对包含它们的方法做异常抛出声明,但这不是必须的。如果没有捕获和抛出声明也一样能通过编译器的语法检测正常编译。比如:OutOfMemoryError 因为内存溢出或没有可用的内存提供给垃圾回收器时,Java 虚拟机无法分配一个对象,这时抛出该错误。像这样严重的异常情况如果出现,你即便捕获到了也不大可能通过异常处理解决此异常情况,所以不是必须(当然也没必要或不应该)捕获它们或作抛出声明。对于运行时异常,例如:NullPointerExcetion 如果代码编写的没有漏洞,空指针异常完全可以避免(通过 if (s != null) s.doSomething();),所以同样不应该捕获或声明抛出。虽然运行时异常绝大多数不应捕获,但有时做捕获处理有利于简化代码的逻辑,例如:将字符串解析成整数的 Integer.parseInt(String s) 方法,如果字符串格式不正确可能抛出 NumberFormatException 这个运行时异常,作捕获处理会比在解析前用正则表达式先校验其格式方便得多。
常见的不受检异常有:(运行时异常)
1.类型转换异常(ClassCastException)
2.数组超界异常(ArrayIndexOutBoundsException)
3.指定数组维数为负值异常(NegativeArraySizeException)
4.算术异常(ArithmeticException)
5.Java系统内部异常(IncompatibleTypeException)
6.内存溢出异常(OutOfMemoryException)
7.没有找到类定义异常(NoClassDefFoundException)
8.空指针异常(NullPointerException)
受检异常:
这以上之外的其它异常都是 Checked Exception,分别描述了不同的异常情况,对于这些异常都应该也必须作异常捕获处理或对方法作异常抛出声明,否则代码通不过编译器编译
常见受检异常:(非运行时异常)
1.ClassNotFoundException:找不到类或接口所产生的异常
2.CloneNotSupportedException:使用对象的clone方法,但无法执行Cloneable所产生的异常.
3.IllegalAccessException:类定义不明确所产生的异常
4.IOException:在一般情况下不能完成IO操作所产生的异常.
5.EOFException:打开文件没有数据可以读取所产生的异常
6.FileNotFoundException:在文件系统中,找不到文件名称或路径所产生的异常
7.InterruptedIOException:目前线程等待执行,另一线程中断目前线程IO运行所产生的异常
public class ChackedException extends ClassNotFoundException {
public ChackedException(){
super(“抛出受检异常”);
}
public ChackedException(String massage){
super(massage);
}
}
/**
* 这里继承的是ArrayIndexOutOfBoundsException,是属于不受检的异常,
* 这里继承哪个都行,只要是不受检的异常类就行。
* @author Administrator
*
*/
public class UnCheckedException extends ArrayIndexOutOfBoundsException {
public UnCheckedException(){
super(“抛出不受检异常”);
}
public UnCheckedException(String massage){
super(massage);
}
}
import java.util.*;
public class ExceptionTest {
/**
* @param args
*/
public static void main(String[] args) throws ChackedException{
// TODO 自动生成方法存根
int number = new Random().nextInt(100);
System.out.println(“number = ” + number);
if(number 50 ){
try{
throw new ChackedException();
}catch(ChackedException e){
System.err.println(e.getMessage());
}finally{
System.out.println(“finally in chacked”);
}
}
if(number 20){
try{
throw new UnCheckedException();
}catch(UnCheckedException e){
System.err.println(e.getMessage());
}finally{
System.out.println(“finally in unchacked”);
}
}
}
}
总结:不受检异常可以捕获或抛出,也可以不捕获不抛出,这时也能够通过编译,只会在运行是出现异常时终止程序.
受检异常必须捕获或抛出,否则就通不过编译.
java异常connection reset by peer是什么异常?怎么解决?
connection reset by peer:连接被对方重设是服务器向客户传输数据时由于超负荷、网络中断、防火墙影响或未按规定关闭网络时导致的问题。 出现该错误,重启即可。要避免该错误,需要在程序退出前关闭所有网络。
具体含义
表明你在对一个对端socket已经关闭的的连接调用write或send方法,在这种情况下,调用write或send方法后,对端socket便会向本端socket发送一个RESET信号,在此之后如果继续执行write或send操作,就会得到错误描述为connection reset by peer。
状况原理
该java异常在客户端和服务器端都有可能发生,引起该异常的原因有两个:
1、如果一端的插座被关闭(或主动关闭,或因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(同级重置连接)。
2、一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(重新连接)。
原因分析
具体的分析可以结合TCP的”四次握手”关闭。TCP是全双工的信道,可以看作两条单工信道,TCP连接两端的两个端点各负责一条。当对端调用close时,虽然本意是关闭整个两条信道,但本端只是收到FIN包。按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道,仍然可以继续接收数据。也就是说, 因为TCP协议的限制,一个端点无法获知对端的socket是调用了close还是shutdown。
对于一个TCP连接,如果对端执行close操作,则会向本端发送一个FIN分节,这时候读本端socket会返回0,我们就知道对方已经关闭了连接,通常这时候我们会在本地调用close来主动关闭本端连接。但如果对方socket已经执行了close的操作,本端socket还继续在这个连接上写数据,就会触发对端socket发送RST报文,按照TCP的四次握手原理,这时候本端socket应该也要开始执行close的操作流程了,而不是接着发数据。
Connection reset by peer的常见原因和解决方法:
1.服务器的并发连接数超过了其承载量,服务器会将其中一些连接关闭;如果知道实际连接服务器的并发客户数没有超过服务器的承载量,则有可能是中了病毒或者木马,引起网络流量异常。
解决方法:可以使用netstat -an命令查看网络连接情况。
2.客户关掉了浏览器,而服务器还在给客户端发送数据;
3.浏览器端按了Stop;这两种情况一般不会影响服务器。但是如果对异常信息没有特别处理,有可能在服务器的日志文件中,重复出现该异常,造成服务器日志文件过大,影响服务器的运行。
解决方法:对引起异常的部分,使用try…catch捕获该异常,然后不输出或者只输出一句提示信息,避免使用e.printStackTrace();输出全部异常信息。
4.防火墙的问题;如果网络连接通过防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会关闭这个TCP的会话,关闭后在读写,就会导致异常。
解决方法:如果关闭防火墙,解决了问题,需要重新配置防火墙,或者自己编写程序实现TCP的长连接。实现TCP的长连接,需要自己定义心跳协议,每隔一段时间,发送一次心跳协议,双方维持连接。
5.JSP的buffer问题。JSP页面缺省缓存为8k,当JSP页面数据比较大的时候,有可能JSP没有完全传递给浏览器。
解决方法:这时可以适当调整buffer的大小。
参考资料
CSDN:
多走一步: