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.java

class 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等终止方法的语句,则就不会跳回执行,直接停止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值