Java最高

使用Spring 5和Spring Boot 2开始,通过学习的春天课程:

>>看看这个课程

1.介绍

本教程主要介绍一些常见的Java异常。

我们首先讨论一个基本上是一个例外。稍后,我们将详细讨论不同类型的检查和未经检查的异常。

2.例外

异常是在执行程序期间在代码序列中发生的异常情况。当程序在运行时违反某些约束时,就会出现这种异常情况。

所有异常类型都是类的子类例外。然后将该类子类化为已检查异常和未检查异常。我们将在后面的小节中详细考虑它们。

3.检查例外

检查异常是必须处理的。它们是类的直接子类例外

有一个辩论关于它们的重要性,我们值得一看。

让我们详细定义一些受控异常。

3.1。IoException.

方法抛出一个IoException.或当任何输入/输出操作失败时,它的直接子类。

这些I/O操作的典型用法包括:

  • 使用文件系统或数据流使用java.io.
  • 使用创建网络应用程序Java.net.

filenotfoundException.

filenotfoundException.是一种常见的类型IoException.使用文件系统时:

try {new FileReader(new File("/invalid/ File /location"));} catch (FileNotFoundException e) {LOGGER.info("FileNotFoundException caught!");}

malformedurlexception.

在使用URL时,我们可能会遇到MalformedURLException -如果我们的URL无效。

try {new URL("malformedurl");} catch (MalformedURLException e){记录器。错误(“MalformedURLException抓到!”);}

3.2。抛出ParseException

Java使用文本解析以基于给定的对象创建对象字符串。如果解析导致错误,则将抛出抛出ParseException

例如,我们可以代表日期以不同的方式例如DD / mm / yyyy或者DD,mm,yyyy,但是试着分析细绳采用不同的格式:

try {new SimpleDateFormat("MM, dd, yyyy").parse("invalid-date");} catch (ParseException e){记录器。错误(“抛出ParseException抓住!”);}

在这里,这是细绳畸形并导致一个抛出ParseException

3.3。InterruptedException

每当Java线程调用时加入(),睡眠()或者wait ()它可以除等待州或者timed_waiting.状态。

另外,一个线程可以通过调用另一个线程的线程来中断另一个线程中断()方法。

因此,线程抛出一个InterruptedException如果另一个线程中断它在它处于中断等待或在timed_waiting.状态。

考虑下面两个线程的例子:

  • 主线程启动子线程并中断它
  • 子线程启动并调用睡眠()

这种情况会导致一个InterruptedException:

class ChildThread extends Thread {public void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {LOGGER。错误(“InterruptedException抓到!”);}}} public class MainThread {public static void main(String[] args) throws InterruptedException {ChildThread ChildThread = new ChildThread();childThread.start ();childThread.interrupt ();}}

4.未经检查的例外

对于Unchecked Exceptions,编译器在编译过程中不进行检查。因此,处理这些例外的方法不是必需的。

所有未选中的异常都扩展了类runtimeexception。

让我们详细讨论一些未经检查的异常。

4.1。空指针异常

如果应用程序试图使用它实际上需要一个对象实例,该方法将抛出一个空指针异常

有不同的场景,非法用途原因NullPointerException。让我们考虑其中一些。

调用一个没有对象实例的类的方法:

字符串strobj = null;Strobj.equals(“Hello World”);//抛出nullpointerexception。

此外,如果应用程序尝试使用a访问或修改实例变量参考,我们得到空指针异常:

人物personobj = null;字符串名称= personobj.personname;//访问null对象personobj.personname =“jon doe”的字段;//修改null对象的字段

4.2。ArrayIndexoutofBoundSexception.

阵列以连续的方式存储其元素。因此,我们可以通过索引访问其元素。

然而,如果一条代码尝试访问数组的非法索引,则相应的方法抛出ArrayIndexOutOfBoundException。

让我们看看一些扔的例子arrayIndexoutofboundException.

Int [] nums = new Int [] {1, 2, 3};int numFromNegativeIndex = nums[-1];//尝试访问负索引int numFromGreaterIndex = nums[4];//尝试访问更大的索引int numFromLengthIndex = nums[3];//尝试访问等于数组大小的索引

4.3。stringIndexoutofBoundSexception.

细绳Java类提供了访问字符串的特定字符或将字符阵列切出的方法字符串。当我们使用这些方法时,内部它会转换细绳到字符数组中。

同样,这个数组上可能存在非法使用索引的情况。在这种情况下,这些方法细绳班级抛出了stringIndexoutofBoundSexception.

这个异常表示索引要大于或等于字符串。stringIndexoutofBoundSexception.延伸IndexOutofBoundsexception.

该方法charAt(索引)课堂细绳当试图访问索引值为字符串的长度或其他非法索引:

String str = "Hello World";char charAtNegativeIndex = str.charAt(-1);//尝试访问负索引char charAtLengthIndex = str.charAt(11);//尝试访问索引等于字符串的大小

4.4。NumberFormatException

应用程序通常以数字数据结束细绳。为了将此数据解释为数值,Java允许进行转换细绳数字类型。包装课程如整数,浮点等包含此目的的实用方法。

然而,如果是细绳在转换期间没有适当的格式,则该方法抛出NumberFormatException。

让我们考虑下面的代码片段。

在这里,我们宣布了细绳用字母数字数据。此外,我们尝试使用的方法整数包装类以将此数据解释为数字。

因此,这导致了NumberFormatException:

String str = "100ABCD";int x = Integer.parseInt(str);//抛出NumberFormatException int y = Integer.valueOf(str);/ /抛出NumberFormatException

4.5。ArithmeticException

当程序评估算术运算并导致某些特殊条件时,它会抛出ArithmeticException此外,ArithmeticException仅适用于数据类型。

例如,如果我们试图用一个整数除以0,我们得到ArithmeticException

int illegalOperation = 30/0;/ /抛出ArithmeticException

4.6。ClassCastException.

Java允许打字在对象之间,以支持继承和多态性。我们可以向上转换对象,也可以向下转换对象。

在扫上,我们将物体施放到其超级类型。并且在衰退中,我们将一个物体投入其中一个亚型。

然而,在运行时,如果代码尝试将对象衰减到它不是实例的子类型,则该方法抛出aClassCastException.

运行时实例是TypeCasting中实际上的实际问题。考虑以下遗产动物狗,狮子

类动物{}类狗延伸动物{}狮子延伸动物{}

此外,在驾驶室,我们施放了动物的实例的引用狮子成一个

但是,在运行时,JVM会注意到该实例狮子与类的子类型不兼容

这导致了这一点classcastException:

动物动物=新狮子();//在运行时,实例是狮子狗Tommy =(狗)动物;//抛出ClassCastException.

4.7。IllegalArgumentException.

方法抛出一个IllegalArgumentException.如果我们用一些非法或不适当的参数称之为。

例如,睡眠()的方法线程班级期望积极的时间,我们将负时间间隔作为参数传递。这导致了这一点IllegalArgumentException.

Thread.currentThread () .sleep (-10000);/ /抛出IllegalArgumentException

4.8。IllegalStateException.

IllegalStateException.表示方法在非法或不适当的时间被调用。

每个Java对象都有一个状态(实例变量)和某些行为(方法)。因此,IllegalStateException.意味着使用当前状态变量调用此对象的行为是非法的。

然而,对于一些不同的状态变量,它可能是合法的。

例如,我们使用迭代器来迭代列表。无论何时初始化,它都会在内部设置它的状态变量lastRet到-1。

在这种情况下,程序试图调用去掉列表中的方法:

//初始化索引为-1 Iterator intListIterator = new ArrayList<>().iterator();intListIterator.remove ();/ / IllegalStateException

在内部,这去掉方法检查状态变量lastRet如果它小于0,它会抛出IllegalStateException。这里,变量仍然指向值-1。

结果,我们得到IllegalStateException.

5.结论

在本文中,我们首先讨论了什么例外情况。一个例外是一个事件,在执行程序期间发生,这会破坏程序指令的正常流程。

然后,我们将例外分类为已选中的异常和未选中的异常。

接下来,我们讨论了在编译时或运行时在编译时可能出现的不同类型的异常。

我们可以找到本文的代码在github上

Java底部

使用Spring 5和Spring Boot 2开始,通过学习的春天课程:

>>看看这个课程
评论在本文上关闭!