当前位置: 首页 > article >正文

java 乱写4 异常常常常

1.Throwable 子类

 

内容来源:

Java Throwable类及其子类_loongshawn的博客-CSDN博客_java throwable

这里写图片描述

 Error类:就是程序运行时候抛出的最严重级别的错误了,如VirtualMachineError,ThreadDeath。抛出了Error的程序从Java设计的角度来讲,程序基本不可以通过后续代码修复,从而理应终止。

Exception类,分为checked和unchecked。

checked Exception就是在写代码的时候,IDE会要求你写try catch的那种Exception,比如IOException。这种Exception是Java的设计者要求你的程序去处理的。这种异常一般不会影响程序的主体,容易手动诊断修复,所以Java要求你在catch下面写出处理的代码,以保证程序遇到此类exception之后还可以正常运行。

unchecked这一类就是你在代码处理了checked exception之后,你在运行时候依然会遇到的exception,所以又叫做RunTimeException,比如NullPointerException, IndexOutOfBoundsException。此类exception相较于前面那种更容易影响程序运行,从设计者角度不提倡从程序中catch出来并处理,当然你也可以这么做。
 

2.StackOverflowError

java虚拟机的栈不够用了,一般是过深递归导致的。

class B
{void f(){f();}
}
class A
{public static void main(String[] args){B b = new B();b.f();}
}

直接爆栈

class B
{C c = new C();
}
class C
{B b = new B();
}
class A
{public static void main(String[] args){B b = new B();}
}

循环实例化,爆栈。

3.OutOfMemory

1.java.lang.OutOfMemoryError: Java heap space
原因:Heap内存溢出。
解决:调整java启动参数 -Xms -Xmx 来增加Heap内存。

2.java.lang.OutOfMemoryError: unable to create new native thread
原因:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。
解决:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS/MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。

3.java.lang.OutOfMemoryError: PermGen space
原因:Permanent Generation空间不足,不能加载额外的类。
解决:调整-XX:PermSize= -XX:MaxPermSize= 两个参数来增大PermGen内存。一般情况下,这两个参数不要手动设置,只要设置-Xmx足够大即可,JVM会自行选择合适的PermGen大小。

4.java.lang.OutOfMemoryError: Requested array size exceeds VM limit
原因:这个错误比较少见(试着new一个长度1亿的数组看看),同样是由于Heap空间不足。如果需要new一个如此之大的数组,程序逻辑多半是不合理的。
解决:修改程序逻辑吧。或者也可以通过-Xmx来增大堆内存。

基本上常见的够了,剩下的遇到再说。

(5条消息) Java中的OutOfMemoryError的各种情况及解决和JVM内存结构_weixin_34380948的博客-CSDN博客

4.异常处理方式

1.抛出异常throw,throws

2.程序捕获处理try,catch,finally

try    用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch   用于捕获异常。catch用来捕获try语句块中发生的异常。
finally  finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
throw   用于抛出异常。
throws  用在方法签名中,用于声明该方法可能抛出的异常。主方法上也可以使用throws抛出。如果在主方法上使用了throws抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导致程序中断执行。

class A
{public static int f(int a,int b,int c,int d)throws Exception{try{c = a/b;b = a/d;}catch (Exception e){//System.out.println(e);d = 1;throw(e);}finally{System.out.println("!"+a+" "+b+" "+c+" "+d);//return 12;}return 12;}public static void main(String[] args){int a,b,c,d;a = 1;b = 2;c = 3;d = 0;try{int h = f(a,b,c,d);System.out.println(h);}catch (ArithmeticException e){System.out.println("divided by zero!");}catch (Exception e){System.out.println("other: "+e);}}
}

可以尝试打开那个注释看看警告是啥。

5.RuntimeException

ArithmeticException:数学计算异常。

​
class A
{public static void main(String[] args){int a,b,c,d;a = 1;b = 2;c = 3;d = 0;try{int e = c/d;}catch (ArithmeticException e){System.out.println(e);}catch (Exception e){System.out.println("other: "+e);}}
}​

NullPointerException:空指针异常。

int [] a = null;try{a[0] = 1;}catch (NullPointerException e){System.out.println(e);}

NegativeArraySizeException:负数组长度异常。
ArrayIndexOutOfBoundsException:数组索引越界异常。

class A
{public static void main(String[] args){int [] a = new int [100];try{a[100] = 1;}catch (ArrayIndexOutOfBoundsException e){System.out.println(e);try{a = new int[-1];}catch(NegativeArraySizeException ee){System.out.println(ee);}}catch (Exception e){System.out.println("other: "+e);}}
}

ClassCastException:类型强制转换异常。

class fa
{}
class son1 extends fa
{}
class son2 extends fa
{}
class A
{public static void main(String[] args){try{fa first = new son1();fa sec = new son2();first = (son2)(first);}catch (ClassCastException e){System.out.println(e);}catch (Exception e){System.out.println("other: "+e);}}
}

报错就不写了,那玩意看不懂不会自己翻译吗

6.自定义异常

//my_expection.java
package test;
public class my_expection extends Exception
{my_expection(String msg){super(msg);}static void throw_one(int a)throws my_expection{if(a>25 || a<15){throw new my_expection("age "+a+" is not allowed");}}
}//1.javaclass A
{public static void main(String[] args){try{int age = 10;my_expection.throw_one(age);}catch (ClassCastException e){System.out.println(e);}catch (Exception e){System.out.println("other: "+e);}}
}

7.throws与throw的区别。

throw   用于抛出异常。
throws  用在方法签名中,用于声明该方法可能抛出的异常。主方法上也可以使用throws抛出。如果在主方法上使用了throws抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导致程序中断执行。例子上面就有不少。

8.finally

finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。

http://www.lryc.cn/news/2417325.html

相关文章:

  • (linux)中文显示乱码问题解决方法(编码查看及转换)
  • 电脑常识——host文件修改(屏蔽网站或解开屏蔽)
  • Java 8 的 Nashorn 脚本引擎教程
  • 串行通信接口详细描述
  • APUE学习之socket网络编程
  • [JavaScript]如何将www.xxx.com变为com.xxx.www
  • Serialization全解析
  • 手把手教你ubuntu下移植MJPG-streamer
  • 软件的三层架构
  • php pathinfo 什么用,在php中pathinfo函数起什么作用呢?
  • 使用Flurl轻松构建URL并在.NET中进行可测试的HttpClient调用
  • 单点登录实现的几种方式及原理【单点登录】
  • FTP客户端和服务器的设计与实现(C#)
  • 超详细双系统安装指南
  • IGBT驱动及保护电路(之一)
  • MemoryStream有关内存数据的读写
  • cpio文件的压缩与解压缩
  • Javascript中parentElement和parentNode的区别
  • 在线提取网页视频的网站
  • Mysql数据库中修改密码的几种方式
  • VB使用ADODB操作数据库的常用方法
  • 全国电子市场大全
  • 字符数组---string用法
  • Android 模拟器使用 Fiddler 抓包
  • ONNX 模型格式分析与使用
  • (原创)教你如何使用VNN来异地管理内网服务器
  • 面向新手的Web服务器搭建(一)——IIS的搭建
  • 转 color颜色十六进制编码大全~
  • js nextSibling属性和previousSibling属性概述及使用注意
  • 0成本搭建个人博客网站之制作静态网页