异常基本概念写在前面:觉得有帮助的话大家可以点在评论支持哈哈
文章目录
陌生人我们一起加油
- 异常基本概念
- 异常体系图
- 五大常见运行时异常
- 1.NullPointerException空指针异常
- 2.ArithmeticException数序运算异常
- 3.ArrayIndexOutBoundsException 数组下标越界异常
- 4.ClassCastException类型转换异常
- 5.NumberFormatException数字格式不正确异常
- 常见编译异常
- 异常处理
- 方式一:try-catch-finally
- 方式二:throws
准备好了吗,要学习新的内容了
Java语言中将程序执行发生的不正常情况称为异常(开发中的语法错误和逻辑错误不是异常)
异常体系图下面让我们来一起看一看异常体系图吧
异常体系图小结
- 异常分为编译异常和运行异常
- 运行异常是编译器检测不出来的异常,可不做处理,因为这类异常很普遍,一般是编程时的逻辑错误,程序员应该注意避免出现的异常
- 编译异常是编译器要求必须处置的异常
在异常体系图中我们已经列出来了五个常见的运行时异常.
它们分别是空指针异常,算术异常,数组越界异常,类型转化异常和数字格式异常
下面就让我们来进一步认识这几个异常吧
1.NullPointerException空指针异常
所谓空指针异常就是当程序在需要对象的地方使用null时就会抛出异常
下面我们来看一段代码
public class NullPointer { //空指针异常
public static void main(String[] args) {
String name=null;
System.out.println(name.length());
}
}
果然结果不出所料,程序报错了,空指针异常
2.ArithmeticException数序运算异常
出现异常的算术条件时抛出异常,比如 一个整数除于0的时候抛出异常
3.ArrayIndexOutBoundsException 数组下标越界异常
用非法索引访问数组时抛出的异常 ,如果索引为负或大于等于数组大小,该索引就是非法索引
下面来看一段数组下标越界异常的代码
public class ArrayIndexOutOfBoundsException {//数组越界
public static void main(String[] args) {
int [] arr={1,2,4};
System.out.println(arr[3]);
}
}
运行结果也是报错
4.ClassCastException类型转换异常
当试图将对象强制转换为不是实例的子类时抛出该异常
代码如下
public class ClassCastException { //类型转化异常
public static void main(String[] args) {
A b = new B(); //父类引用指向子类对象,向上转型
B b1=(B)b; //向下转型,这里运行正确
C c2=(C)b;//把b指向的对象转给C,因为B类和C类没有关系,所以这就是类型转换异常,会报错
}
}
class A{}
class B extends A{}
class C extends A{}
运行结果报错
5.NumberFormatException数字格式不正确异常
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换成该格式的时候抛出该异常,通过这个方法我们可以确保输入是满足条件的数字
代码如下
public class NumberFormatException { //数字格式不正确异常
public static void main(String[] args) {
String name="李文浩";
//将String转换为int
int num=Integer.parseInt(name); //name字符串无法转换成整数,这里会抛出NumberFormatException
System.out.println(num);
}
}
运行结果抛出数字格式不正确异常
常见编译异常- SQLException *** 作数据库时查询表可能发生异常
- IOException *** 作文件时,发生异常
- FileNotFoundException 当加载一个不存在的文件时,发生异常
- ClassNotFoundException 加载类,而该类不存在时发生异常
- EOFException *** 作文件 到文件末尾发生异常
- IIIegalArgumentException 参数异常
前面我们已经了解了很多关于异常的知识,那么,当遇到这些异常时我们该如何处理呢,让我们来学习一下吧
方式一:try-catch-finally
IDEA中try-catch-finally的快捷键是ctrl+alt+t
try-catch-final的处理机制如下
- 异常发生了那么异常发生后面的代码不会执行直接进入catch块
- 异常没有发生,则顺序执行try的代码块,不会进入到catch
- 异常是否发生都要执行finally块里面的代码(通常是关闭连接,释放资源等)
- 如果try代码块可能有多个异常,可以使用catch分别捕获不同的异常要求子类异常写在前面,父类异常写在后面,因为父类异常一旦写在前面就会包含子类异常,那么子类异常就没有意义了
- 也可以使用try-finally,这种用法相当于没有捕获异常,程序会崩掉,应用场景,就是执行一段代码,不管是否发生异常都必须执行某个业务逻辑
try {
//代码即有可能有异常的代码
} catch (Exception e) {
//捕获到异常
//当异常发生时系统将异常封装称Exception对象e,传递给catch
//得到异常对象后程序可以自己处理,即可添加要 *** 作的内容
//如果没有发生异常那么catch代码块就不执行
} finally {
//不管try代码块是否有异常发生,都要执行final
//所以通常将释放资源的代码放在finally
//没有finally语法上也是通过的
}
try-catch的一个经典应用场景
如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
public class TrycatchExercise04 {
public static void main(String[] args) {
//当用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
Scanner scanner = new Scanner(System.in);
int num = 0;
String inputStr = "";
while (true) {
System.out.println("请输入一个整数");
inputStr = scanner.next();
try {
num=Integer.parseInt(inputStr);//这里可能抛出异常
break; //Integer.parseInt就是将一个String类型的整数转换成int类型的整数,比如"123'=>123
} catch (java.lang.NumberFormatException e) {
System.out.println("你输入的不是一个整数");
}
}
System.out.println("你输入的值是"+num);
}
}
方式二:throws
throws通俗的讲就是甩锅,当程序遇到异常时使用throws就是将这个异常甩给方法调用者直到jvm机,jvm机直接输出异常信息并结束程序
如果没有显式使用try-catch-finally和throws方法,那么系统默认的是throws方法
那么我们可以回想一下我们之前写过的程序,如果程序有异常时我们没有写try-catch-finally和throws的情况下运行时还是会有异常信息,那么这是怎么回事呢?
哈哈,那其实是我们的程序默认有了throws处理异常的方法
你以为的程序:
public static void main(String[] args) {
实际上的程序:
public static void main(String[] args) throws Exception {
所以当我们程序有异常时,会有默认的throws将异常扔给顶级的jvm把信息输出并结束程序
关于throws有一个细节:
子类重写父类方法时,对抛出异常的规定:子类重写的方法所抛出的异常要么和父类类型抛出的异常一致,要么为父类抛出的异常类型的子类型
class Father{ //父类
public void method() throws RuntimeException{
}
}
class Son extends Father{ //子类
//子类重写父类方法时,对抛出异常的规定:子类重写的方法
//所抛出的异常要么和父类类型抛出的异常一致,要么为父类抛出的异常类型的子类型
@Override
public void method() throws NullPointerException{
}
}
好了关于异常处理的这些你学会了吗,记得一件三连交学费哦
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)