Java中的例外处理
时间:2020-02-23 14:34:09 来源:igfitidea点击:
什么例外?
- Java Doc说:"一个例外是一个事件,在执行程序期间发生,这会破坏程序的正常流程。"
- 术语"例外"是指"卓越条件",并且是改变正常程序流程的发生。
- 一堆事情可能导致例外,包括硬件故障,资源疲惫和良好的旧错误。
- 当在Java中发生异常事件时,据说例外将被"抛出"。
- 负责执行关于异常的代码称为"异常处理程序",它"捕获"抛出异常。
- 每个例外都将在运行时抛出。
throwable.
- java.lang套餐中存在ruplable类。
- Throwable是Java中所有异常类的超级类。
- 它有两个直接子类,如异常,错误(当然每种异常类直接或者间接划分丢弃的群)。
- 它有一些方法是根据申请要求打印例外详细信息。
例外
- 例外是java.lang包中存在的类。
- 此类没有它是自己的方法,它继承了来自ROLLABLE类的方法。
- 此类的所有子类被视为已检查的异常(Runtimeexception除外和它的子类除外)。
runtimeexception.
- runtimeexception是java.lang包中存在的类。
- 它是异常类的子类。
- 此类也没有自己的方法,它继承了来自克拉的类的方法。因为Throwable是间接超级runtimeexception的。
- 此类的所有子类被视为未经检查的异常。
错误
- 错误是java.lang包中存在的类。
- 它是划分的小类。
- 此类也没有自己的方法,它继承了来自克拉的类的方法。因为Throwable是间接超级runtimeexception的。
- 此类的所有子类被视为未选中的错误。
检查例外
- 如果一个类是直接或者间接类别的异常类的子类,并且不应该是RuntimeException类的子类,它是一个检查的异常。
- 为什么要检查的名称,因为可以在编译时检测到这些异常。
- 当然检查了在运行时抛出的异常,必须是Java代码需要在编译时声明或者处理它们,否则代码不编译。
- 这些是由代码控制外部的意外条件引起的(例如,数据库向下,文件I/O错误,错误输入等)。
- 这些以编程方式抛出。
- 这些是可恢复的错误。
- 例如,IOException是一个被检查的异常,它会在尝试打开该位置中不存在的文件时发生。
- 我们可以通过将文件放在同一位置来恢复此异常。
ocajp检查的例外
当代码尝试参考不存在IoException的文件时,FileNotFoundException以编程方式抛出的文件,当读取或者写入文件时,不存在。
对于OCA考试,我们只需要知道这些是检查的例外情况。
还要记住,FilenotFoundException是IoException的一个子类,但如果考试会提醒你这个事实,如果它出现。
我们将在OCP考试中更详细地看到这两个例外。
未经检查的例外
- 如果一个类是直接或者间接或者间接runtimeexception类的子类,则它是一个未经检查的异常。
- 为什么名称取消选中,因为这些未在编译时检测到这些。因此,Java代码要求申报或者处理它们不是必需的。
- 这些也在运行时抛出。
- 这些被JVM抛出。
- 这些也是可恢复的错误。
- 例如:当我们在参考变量上调用方法时,它为null导致nullpointerexception。
- 我们可以从此异常中恢复,通过选中参考为null,或者在该引用的方法之前。
OCAJP未经检查的例外情况
arithmeticexception•当代码尝试划分为零时,它被JVM抛出。
例子 :
int b= 9; int c = b/0;
运行此代码导致以下输出:线程中的异常"main"java.lang.arithmeticexception:/by零
ArrayIndexoutofBoundSexception.
- 当代码使用非法索引访问数组时,它被JVM抛出。
- 例子 :
int[] a = new int[2]; System.out.println(a[-1])
- 这是一个问题,因为没有否定数组索引这样的东西。运行此代码givess以下输出:线程中的异常"main"java.lang.arrayIndexoutofBoundSexception:-1
classcastException.
- 当尝试将异常投用到一个子类时,它被JVM抛出了它,它不是实例的子类
- 例子 :
String type = "OCAJP8"; Object obj = type; Integer number = (Integer) obj;
- 编译器将来自对象的转换为整数。这可能没关系。编译器不会意识到该对象中有一个字符串。当代码运行时,它会给以下输出:线程"main"java.lang.classcastException:java.lang.string无法投射到java.lang.integer
IllegalArgumentException.
- 它被程序员抛出,表示方法已通过非法或者不恰当的参数。
- 例子 :
public static void setCount(int count) { if (count < 0) throw new IllegalArgumentException("cont must not be negative"); this.count = count; }
- 当对参数值不满意时,该程序会抛出异常。输出如下所示:线程"main"java.lang.lang.illegalargumentException:count不得为负
空指针异常
- 当有空引用时,它被JVM抛出,其中需要对象。
- 例子 :
String name; public void printLength() throws NullPointerException { System.out.println(name.length()); }
- 运行此代码会导致此输出:线程中的异常"main"java.lang.nullpointerexception
numberformatexception.
当尝试将字符串转换为数字类型但字符串没有适当的格式时,它被编程器抛出。
例子 :
Integer.parseInt("OCA");
输出看起来如此:线程"main"java.lang.numberformatexception:输入字符串:"oca"的例外
错误
- 如果类是直接或者间接或者间接出现错误类的子类,则它是一个错误。
- 对于错误,java代码要求申报或者处理它们不是必需的。如果我们捕获,则不会编译时间错误。但你不应该抓住它。
- 这些被JVM抛出。
- 这些是不可恢复的错误。
- 例如,当我们尝试创建无限对象时,我们将获得OutofMemoryError。
- 我们无法从这些错误中恢复。
ExpernipinItializerError.
- 当静态初始化器抛出异常并且不处理它时,它被JVM抛出。
- 例子 :
static { int[] c = new int[3]; int num = c[-1]; } public static void main(String[] args) { }
- 此代码提供有关两个例外的信息:线程"main"java.lang.exceptionInitializerError引起的:java.lang.arrayIndexoutofboundsexception:-1
- 我们得到ExperfipinItializerError,因为静态初始化程序中发生错误。
- 单独的信息对于解决问题并不特别有用。因此,Java还告诉我们问题的原因:arrayIndexoutofBoundSexception
- 我们需要修复ExpectionIninitializerError,因为Java无法加载整个类。此失败可防止Java继续。因此,错误是不可恢复的。
stackoverfloweror.
- 当方法调用太多时间时,它被JVM抛出(这称为INFI NITE递归,因为该方法通常呼叫本身而无端)。
- 例子 :
public static void call(int n) { call(8); }
- 输出包含此行:线程中的异常"main"java.lang.stackoverfloweror
- 由于方法调用自己,它永远不会结束。最终,Java在堆栈上的房间内运行并抛出错误。这称为无限递归。
noclassdeffounderror
当代码使用在编译时但不运行时可用时,它被JVM抛出。
此错误不会在考试的代码中显示 - 我们只需要知道它是一个错误。
检查的异常,未经检查的异常和错误之间的区别
参数 | 检查的异常 | 未选中的异常 | 错误 |
---|---|---|---|
如何识别 | 子类异常类 | runtimeexception类的子类 | 子类错误类 |
是否容易catch | 是 | 是 | no |
是程序所需处理或者声明 | 是 | no | 不 |
抛出 以编程方式 | JVM | JVM | |
可恢复 | 是 是 | no | |
示例 | ioException filenotfoundException等 | nullpointerexception classcastException 等等 | stackoverflowerror OutofMemoryError 等等 |