java异常
什么是Java异常:
在Java中,异常(Exception)是一种特殊的事件,它表示程序运行过程中出现了某种不正常的情况,可能导致程序无法正常执行。异常的出现通常是由于程序的错误、运行环境的问题或者用户输入的不合法数据等原因引起的。Java通过异常处理机制来帮助程序开发者更好地处理这些异常情况,从而提高程序的健壮性和可靠性。Jana中的所有不正常的类都继承与Throwable类,Throwable又包含两个大类,一个是Error类另一个是Exception类,而我们本期要解释的就是Exception(异常)。
Java中的异常主要分为两大类:
- 受检查的异常:这些异常是程序在运行过程中可能会出现的、并且可以通过合理的手段避免的异常。
- 非受检查的异常(Unchecked Exception):这些异常通常是由于程序的逻辑错误引起的,例如NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组索引越界异常)和ArithmeticException(算术异常)。非受检查的异常不需要在代码中显式地处理,但它们可能会导致程序崩溃。
2. 常见的异常类型
- NullPointerException:当尝试访问一个null对象的成员时抛出。
- ArrayIndexOutOfBoundsException:当数组索引超出其有效范围时抛出。
- ArithmeticException:当发生非法的算术运算时抛出,例如除以零。
- IOException:当输入输出操作失败时抛出。
- SQLException:当数据库操作失败时抛出。
- ClassNotFoundException:当尝试加载一个不存在的类时抛出。
- NumberFormatException:当尝试将一个字符串转换为数字,但该字符串格式不正确时抛出。
3. 异常处理机制
异常被抛出后其后面的代码将不会运行。
Java提供了四种主要的异常处理机制:
- try-catch(处理异常):用于捕获和处理异常。try块中包含可能会抛出异常的代码,catch块用于捕获并处理异常。当try中发现异常时我们的catch才会执行。try语句不能单独存在,必须与catch或者finally连用。执行完catch后继续执行后面的代码。编写catch块时先把NullPointerException,ArrayIndexOutOfBoundsException这样的我们知道会出现的异常类型我们catch先处理,如果不知道的异常类类型,我们就用通用的异常类父类Exception放在最后的catch来运行。如图:
- finally:finally块通常与try-catch一起使用,无论是否捕获到异常,finally块中的代码都会被执行。它通常用于释放资源,如关闭文件流或数据库连接。即使在try和catch中都有return语句但这些返回都要在finlly执行完毕之后才进行。也就是说当try块中有return时当程序运行到return时我们还不能返回。而是先执行完finally中的代码再返回,而这之间的catch块代码将不会被执行,若try块中没return而catch中有,那么当运行到这个return时我们还是要先执行finally的代码再返回。当我们设及到scanner语句时,我们可以在finally里进行scan.close进行关闭,避免了资源浪费。如果finally中有return那么优先级在我们finlly这里所以我们只会返回finally的返回。
- throw:用于手动抛出一个异常对象。可以抛出自定义的异常或标准异常。当我们需要将错误信息抛出给调用者时我们使用throw。(运行时异常使用,若异常为编译时异常或受查异常那么我们要使用throws
-
如图:
-
- throws:用于声明方法可能会抛出的异常。如果一个方法可能会抛出受检查的异常,那么必须在方法签名中使用throws声明。
-
-
在main中调用这方法时由于我们没有声明异常所以我们main中出现异常未处理,如果我们要处理这个异常就在main后再加上throws FileAlreadyExistsException。或者我们将采用try-catch来处理异常。
4. 自定义异常
Java允许开发者自定义异常类。自定义异常类需要继承Exception类(或其子类)。自定义异常通常用于更精确地描述特定的错误情况。
当我们需要我们自己定义异常时我们首先要将我们定义异常的名字去继承我们会出现的异常的类型,若不清楚可以直接继承Exception父类。然后再我们的代码中就可以实现。下面是操作方法:
1.建立我们的自定义类usernameerrorexception。
2.两下shift键找到我们需要的异常,这里我们使用的是RuntimeException,将方法中RuntimeException名字也改成我们自定义的名字:下图。
同样的我们可以生成更多的自定义类(这里还定义了passworderrorexception),然后我们就可以再我们text方法中去使用我们的自定义异常类
我们在main之前也可以直接使用try-catch来先处理异常然后main中就可以不用再去处理异常了:
5. 异常处理的最佳实践
- 不要忽略异常:捕获异常后,应该对其进行适当的处理,而不是简单地打印日志或忽略它。
- 使用具体的异常类型:在捕获异常时,尽量使用具体的异常类型,而不是捕获Exception类的所有异常。
- 合理使用finally块:确保资源在异常发生时也能被正确释放。
- 避免过度使用异常:异常处理机制虽然强大,但过度使用会降低程序的性能和可读性。
总之,Java的异常处理机制为程序开发者提供了一种灵活的方式来处理程序运行过程中可能出现的各种异常情况。通过合理地使用异常处理机制,可以提高程序的健壮性和可靠性。