目录
一.什么是异常:
异常是Java
中的错误,但是并不是所有的错误都是异常,比如说,你在定义变量名的时候没有依照Java
的规则,在语句的结尾少了一个分号,那么运行出来结果是提示是错误 java.lang.Error
;
不过如果你用System.out.println(10/0)
,那这个时候你的程序是可以正常编译的,但是在运行的时候,因为你用0
做了除数,会抛出 java.lang.ArithmeticException
的异常。
二.一些常见的异常原因:
-
输入了错误的数据,比如:程序需要的是
int
类型数据,而用户输入了一串字符串; -
对象没有初始化就调用:下面这段代码就会提示空指针异常;
-
String str = null; int length = str.length();
-
要打开的文件不存在;
-
网络通信时连接中断,或者JVM内存溢出。
三.异常的分类:
Java中的异常分为两类:检查异常和非检查异常。
检查异常:检查异常在程序中必须显式进行处理或者声明抛出,否则会在编译时报错;
非检查异常:非检查异常在程序中可以不做处理也不声明抛出,但是一旦出现异常,程序就会终止。
四.异常中一些常见的关键字及其作用:
Java中异常处理的关键字包括:try、catch、finally、throw和throws。其中,try用于包含可能会抛出异常的代码块;catch用于捕捉异常实例,并进行相应的处理;finally用于在try和catch块执行完毕之后一定会被执行的代码块;throw用于手动抛出一个异常实例;throws用于声明一个方法可能抛出的异常类型,让调用方处理。
五.一些常见的异常类:
其实这些类都是Exception的子类,所以在捕获异常、抛出异常或者自定义异常时都可以使用这个类而不用具体到ArithmeticException等子类,这样可以避免背不住单词。
异常 | 描述 |
---|---|
ArithmeticException | 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。 |
ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数。 |
IllegalMonitorStateException | 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操作所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 如果应用程序试图创建大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
... | ... |
检测性异常:
异常 | 描述 |
---|---|
ClassNotFoundException | 应用程序试图加载类时,找不到相应的类,抛出该异常。 |
CloneNotSupportedException | 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。 |
IllegalAccessException | 拒绝访问一个类的时候,抛出该异常。 |
InstantiationException | 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。 |
InterruptedException | 一个线程被另一个线程中断,抛出该异常。 |
NoSuchFieldException | 请求的变量不存在 |
NoSuchMethodException | 请求的方法不存在 |
IOException及其子类 | 对文件或流的操作有误时,抛出异常 |
... | ... |
六.异常的常规格式:
捕获异常要用到 try、catch关键字有时还要用到finally。
try {
// 执行可能会抛出异常的代码
} catch (Exception e) { // 捕获异常并打印错误信息
e.printStackTrace();
} finally { // 无论是否捕获到异常,都会执行finally块中的代码
// 执行必要的清理和资源释放操作
}
七.异常里面的几种操作:
1.捕获异常:
public class Example {
public static void main(String[] args) {
try {
int[] nums = {1, 2, 3};
System.out.println(nums[3]); // 这里会抛出 ArrayIndexOutOfBoundsException
} catch (Exception e) {// 捕获异常
System.err.println("发生异常:" + e.getMessage()); // 打印错误信息
}
}
}
结果:发生异常:发生异常:Index 3 out of bounds for length 3
2.抛出异常:
throw关键字的作用是:主动抛出异常;
throw
是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常。
注意:使用throw
关键字主动抛出检测性异常的时候,在方法名上必须使用throws
表明调用这个方法可能存在要抛出的异常。
举个例子:
public static void test(int a,int b){
if(b == 0){
throw new ArithmeticException("被除数不能为零");
}
System.out.println(a/b);
}
ArithmeticException
属于运行时异常,是在运行时检测的,所以上述代码编译是能通过的,而FileNotFoundException
是属于检测性异常,是在编译之前就需要处理的,所以第二段程序要加上throws
才能通过编译。
3.自定义异常:
在 Java 中,还可以通过继承 Exception 类或其子类来自定义异常。
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) throws MyException{
Scanner in = new Scanner(System.in);
String s = in.next();
if(s.length() < 3){
throw new MyException("用户名不能小于三位!!");
}else{
System.out.println("用户名格式正确");
}
}
}
class MyException extends Exception{//这里的MyException是随便定义的,其他的名字也可以
public MyException(){}
public MyException(String i){
super(i);
}
}
结果:
2
Exception in thread "main" CSDN.MyException: 用户名不能小于三位!!
at CSDN.Test1.main(Test1.java:12)
总之,Java 异常处理机制是 Java 编程中非常重要的内容。掌握异常处理相关知识,能够更好地保障程序的稳定性和安全性。