So this is a design problem, but I still want to know why.I can't catch outofmemoryerror in java even with 
Catch(Throwable t) {
}So Why I can't catch it ? Or more specifically, why java design this error can't be catched?

解决方案 »

  1.   

    与JVM有关!可通过设置其值在改变内存大小
      

  2.   

    内存不足了,意味着逻辑或数据出错了。这种错误是一个错误,不是一个exception,只有exception才可以捕获。就算你能捕获,也不能够做什么好的处理。
      

  3.   

    这是 错误 与 异常 的区别
    错误是不能被catch的
    内存不足被JAVA语言设计成错误了,为什么要设计成错误呢?
    我个人认为是为了方便,简单,高效,符合JAVA客户需求等等,如果设计成异常会比较麻烦,也没有必要,最重要的是不合理。
      

  4.   

    异常类以Throwable为基类按如下方式分类。在实现代码内如果不加以捕捉就会导致编译错误的异常是Exception类的子类(但是不包括RuntimeException类的子类)。Error类的子类无法处理,或者不应该处理的异常 
    • Java.laERROR.OutOfMemoryError //内存不足
    • Java.laERROR.StackOverflowError //StackOverflow 
    ② Exception类的子类RuntimeException的子类以外的子类 
    • Java.io.IOException //输入输出错误 
    • Java.io.FileNotFoundException //找不到文件(IOException的子类) 
    • Java.sql.SQLException //DB访问异常 
    ③ RuntimeException类的子类 
    在程序运行中到处都有可能发生,由程序员的错误造成的异常。或者,在设计时没有考虑到的情况下发生的异常。  
    • Java.laERROR.ArithmeticException //整数运算时用0做除数   
    • Java.laERROR.ArrayIndexOutOfBoundsException //数组下标错误 
    • Java.laERROR.IllegalArgumentException //参数值错误 
    • Java.laERROR.NullPointerException //访问空指针错误 
      

  5.   

    可以调整
    -Xmx<size>:堆的最大值,如果最大值过小,所需内存超出堆的最大值时,虚拟机会提示内存溢出。
    这个解决
      

  6.   

    error exception 的区别。
      

  7.   

    to 说 error 不能捕获的: 并不是所有的error都不能捕获
    to 说我程序逻辑出错的: 我程序的一个feature就是用尽可能多的内存,然后如果内存不够了,我再释放一点;所有我正准备catch OutOfMemory异常后释放呢,可是现在catch不住。
    to 说 OutOfMemory被捕获不合理的:我认为语言设计至少要有统一性,不能说有些Error是可以被捕获的,有些Error类却是捕获不了的,这样太违背直觉了。而且捕获outofmemory也不是难事么,这个和stackOverflow不一样,毕竟OutOfMemory的时候系统状态还是正常的;况且这个异常被捕获还是很有价值的,比如C++里面的new也会抛出OutOfMemory异常,可以被捕获后释放一些不太重要的内存,然后继续使用。
      

  8.   

    哦。。原来是gbb
    我认为OutOfMemoryError捕获失败不是语言级的问题 是虚拟机自身能力的问题 捕获OutOfMemory完全符合java的语法 编译期运行期也不会报任何错 
    可能在虚拟机抛出OutOfMemoryError的时候 虚拟机用自身所能控制的那点内存已经没有能力干别的事情了
      

  9.   

    所以说这或许是虚拟机的问题 现在虚拟机的策略可能就是到啥也不能干的时候才会抛出个OutOfMemoryErrorPS 总之 我也是98er 额
      

  10.   

    try catch本身似乎也不应该用作正常情况下的业务逻辑处理 可以用一个线程专门监控内存的使用状况然后做些释放之类的什么。。
      

  11.   

    这个怎么说呢,trycatch是用作Exception的,也就是那些可预测的“错误”,这些“错误”往往是使用环境造成的(而不是程序本身的错误),所以增加trycatch可以增强程序对环境的适应性。嗯,可能只能专门开线程监测了:)