java的异常

本文详细介绍了Java中的异常机制,包括异常的概念、抛出机制、对待异常的方式、异常的体系结构(如Throwable、Error和Exception的区别)、常见异常类型(如OutOfMemoryError、StackOverflowError、运行时异常等)以及异常的处理方法,包括try-catch-finally、throws和自定义异常的使用。
摘要由CSDN通过智能技术生成

一 .java异常概述

1.异常:

指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致 JVM的非正常停止。

异常指的并不是语法错误。语法错了,编译不通过,不会产生字节码文件,根本不能运行。

2.异常的抛出机制 :
Java中是如何表示不同的异常情况,又是如何让程序员得知,并处理异常的呢?
Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类型
的对象,并且抛出。
然后程序员可以捕获到这个异常对象,并处理;
如果没有捕获这个异常对象,那么这个异常将会导致程序终止。
如图是一个数组越界的异常。
3.如何对待异常
对于程序出现的异常,一般有两种解决方法:
一是遇到错误就终止程序的运行。
另一种方法是程序员在编写程序时,就充分考虑到各种可能发生的异常和
错误,极力预防和避免。实在无法避免的,要编写相应的代码进行异常的
检测、以及异常的处理,保证代码的健壮性。

.java异常体系结构

1.Throwable
java.lang.Throwable类是Java程序执行过程中发生的异常事件对应的类的根父类。
Throwable 中的常用方法:
public void printStackTrace() :打印异常的详细信息。
包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用 printStackTrace
public String getMessage() :获取发生异常的原因。
Throwable可分为两类:Error和Exception。
分别对应着java.lang.Errorjava.lang.Exception两个类。
Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等
严重情况。一般不编写针对性的代码进行处理。
例如:StackOverflowError(栈内存溢出)和OutOfMemoryError(堆内存
溢出,简称OOM)。
Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,需要使用针对
性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。

三.常见的异常

1.Error
    (1)堆溢出: OutOfMemoryError

                 当堆内存中的对象占用的空间超过了堆的最大限制时,会抛出堆溢出异常。这通常发生             在程序中创建了过多的对象,导致堆内存耗尽。

                堆溢出异常通常是由以下情况引起的:

  1. 程序中创建了大量的对象,但没有及时释放,导致堆内存不断增加,最终超出了限制。
  2. 对象的生命周期过长,导致堆内存中的对象无法被垃圾回收,从而占用了过多的空间。

以下是一个堆溢出异常的示例代码:

public class HeapOverflowExample {
    public static void main(String[] args) {
        try {
            createObjects();
        } catch (StackOverflowError e) {
            System.out.println("堆溢出异常发生:" + e.getMessage());
        }
    }

    public static void createObjects() {
        while (true) {
            Object obj = new Object();
        }
    }
}

在上面的示例中,createObjects 方法会不断地创建新的 Object 对象,由于这些对象没有被及时释放,堆内存中的对象数量不断增加,最终导致堆溢出异常的抛出。

   (2)栈溢出: StackOverflowError

Java异常的栈溢出是指在Java应用程序中,当方法调用的层级过深,导致方法调用栈空间耗尽时会抛出栈溢出异常。每个线程在Java虚拟机中都有一个方法调用栈,用于保存方法的调用信息和局部变量。当方法调用的层级过深,栈空间会不断增加,直到超出了栈的最大限制,就会抛出栈溢出异常。

栈溢出异常通常是由以下情况引起的:

  1. 递归调用导致方法调用层级过深,栈空间被耗尽。
  2. 方法内部的局部变量占用过多的空间,导致栈空间不足。

以下是一个栈溢出异常的示例代码:

public class StackOverflowExample {
    public static void main(String[] args) {
        try {
            recursiveMethod(1);
        } catch (StackOverflowError e) {
            System.out.println("栈溢出异常发生:" + e.getMessage());
        }
    }

    public static void recursiveMethod(int i) {
        System.out.println("调用方法:" + i);
        recursiveMethod(i + 1);
    }
}

在上面的示例中,recursiveMethod 方法是一个递归方法,它会不断地调用自身,导致方法调用的层级不断增加。当方法调用的层级超过了栈的最大限制时,就会抛出栈溢出异常。

2.异常--运行时异常
  数组越界异常
  类型转换异常
  数字格式化异常
  空指针异常
  算术异常
四,异常的处理
1. Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
基本语法 1
  try{
  可能会发生异常的代码
  }catch(异常类型 引用名){
  异常处理代码
  }finally{
  必须执行代码
  }
例:
这里我们看到10除0异常算法,正常运行会报错后程序停止,使用了try catch关键字后便抓出了异常项目,但不影响后续代码的运行,可见下面的  “不受影响” 正常打印。
基本语法 2
  finally
finally该内容总是会执行的,只能有一个finally语句
finally{
必须执行的逻辑
}
在Java中, finally 关键字用于定义在  try-catch 语句块中的一个代码块,无论是否发生异常, finally 中的代码都会被执行。 finally 通常用于确保资源的释放或清理操作,无论是否发生异常都需要执行的代码。
public class FinallyExample {
    public static void main(String[] args) {
        try {
            int result = divide(10, 0);
            System.out.println("结果: " + result);
        } catch (ArithmeticException e) {
            System.out.println("发生算术异常:" + e.getMessage());
        } finally {
            System.out.println("执行finally块");
        }
    }

    public static int divide(int dividend, int divisor) {
        return dividend / divisor;
    }
}
●2. throws,定义一个方法的时候可以使用throws关键字声明,表示此方法
不处理异常,而交给方法调用处进行处理。
例如:
public void test throws 异常1,异常2,异常3{
}
任何方法都可以使用throws关键字声明异常类型,包括抽象方法。
调用使用了throws的方法时必须处理声明的异常,要么使用try-catch,要么
继续使用throws声明。
如果抛出的是运行期异常,则不会有任何提示,需要查看所调用的方法结构.
五.运行期异常和编译期异常
异常分为运行期异常和编译期异常两种
编译时期异常 (即checked异常、受检异常):在代码编译阶段,编译器就能明
确警示当前代码可能发生(不是一定发生)XX异常,并明确督促程序员提前编写
处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判
定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的
代码引起的,例如:FileNotFoundException(文件找不到异常)。
运行时期异常 (即runtime异常、unchecked异常、非受检异常):在代码编译
阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何
提示。只有等代码运行起来并确实发生了XX异常,它才能被发现。通常,这类异
常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免。
java.lang.RuntimeException类及它的子类都是运行时异常。比如:
ArrayIndexOutOfBoundsException数组下标越界异常,
ClassCastException类型转换异常
六.自定义异常
基本语法
public class 异常类名 extends Exception/RuntimeException{
public 异常类名(String msg){
super(msg);
}
}
自定义异常类中往往不写其他方法,只重载需要使用的构造方法
继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或
throws抛出
  • 30
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值