第五章:异常处理

本文详细介绍了Java中的异常处理机制,包括异常处理概述、try-catch-finally语句的使用、throw和throws关键字的应用,以及如何创建自定义异常。通过实例代码展示了当程序遇到异常时,如何捕获并处理这些异常,确保程序的稳定运行。同时强调了异常处理的重要性,以及在处理异常时遵循的顺序规则。
摘要由CSDN通过智能技术生成

第五章:异常处理知识梳理

本章内容分为:异常处理概述、try-catch处理异常、throw和throws、自定义异常。

5.1异常处理概述

问题:为什么要异常处理???
编程中我们常说没有完美的代码,几乎每个应用程序都有这样或那样的小问题,异常并不可怕,只要在编程中预先考虑到可能出现问题的代码,然后加以处理就可以避免异常。

那么程序中如果遇到了异常会怎么样呢?会直接终止程序的运行,下面我们就来看看程序中的异常:

package com.exception;

public class Mytest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        String str=null;
        str.toString();
	}

}

请添加图片描述
这里出现了一个空指针的异常(nullpointerexception)。

问题:如果中间出现了异常,后面是否还会正常执行?请看下面代码:

package com.exception;

public class Mytest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("第1步");
		System.out.println("第2步");
        String str=null;
        str.toString();
		System.out.println("第3步");
		System.out.println("第4步");
	}

}

请添加图片描述
如上代码可知答案:如果中间出现了异常,后面将无法执行。

问题来了,那我们怎么样来处理让它不崩溃呢?所以要进行我们的异常处理,当然在程序运行过程中会出现很多种不同异常,比如说我们的nullpointerexception就是空指针异常,还有下标越界异常。

package com.exception;

public class Mytest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[]strs= {"11","22"};
		System.out.println(strs[2]);
	}

}

请添加图片描述
注释:arrayindexoutofboundsexception是数组的下标越界异常。

还有一种算数异常:

package com.exception;

public class Mytest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(5/0);
	}

}

请添加图片描述
注释:arithmeticexception是算数的异常。

对5.1进行一个小节:一旦出现了运行时异常,程序将终止运行,所以我们就必须要对这种可能出现异常代码进行一个异常捕获处理。

5.2try-catch异常处理
在Java中最顶级的异常处理叫THROWABLE,它下面又分为ERROR异常(一般指系统或硬件级别的异常,我们的Java程序不能处理)和EXCEPTION异常。

(1) 在Java中完成异常的处理一般有两种方式:一种是try catch finally三个关键字,另一种是throw和throws。

下面我们先来看看TRY CATCH FINALLY的使用:

第一个案例:

package com.exception;

public class Mytest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("第1步");
		System.out.println("第2步");
		try {
			System.out.println(5/0);
		} catch (Exception e) {
		e.printStackTrace();
		}
        
		System.out.println("第3步");
		System.out.println("第4步");
	}

}

请添加图片描述

第二个案例:

package com.exception;

import java.util.Scanner;

public class Mytest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Scanner sc=new Scanner(System.in);
			System.out.println("请输入一个整数:");
			int num=sc.nextInt();
			System.out.println("您输入的数字是:"+num);
			
		} catch (Exception e) {
			//记录日志,进行提示等
			System.out.println("您输入的数据和接收的不一致");
			e.printStackTrace();
		}
	}

}

请添加图片描述
注释:inputmismatchexception是输入的不匹配异常。当然我们这里用的exception是所有异常的一个父类,它的范围是最大的,我们也可以把它改成对应的类型。

第三个案例:

package com.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Mytest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Scanner sc=new Scanner(System.in);
			System.out.println("请输入第一个整数:");
			int num1=sc.nextInt();
			System.out.println("请输入第二个整数:");
			int num2=sc.nextInt();
			System.out.println("计算除法的结果是:"+(num1/num2));
			
		} catch (InputMismatchException e) {
			//记录日志,进行提示等
			System.out.println("您输入的数据不合法");
			e.printStackTrace();
		}catch (ArithmeticException e) {
			System.out.println("输入的除数为0");
			e.printStackTrace();
		}catch (Exception e) {
			System.out.println("出现了未知异常");
			e.printStackTrace();
		}
	}

}

请添加图片描述
请添加图片描述

总结:catch块可以有多个,但是范围小的一定要放在前面,范围大的一定要放在后面,并且在catch后我们还可以加入另外一个特殊的模块,我们叫它为finally,finally是什么意思呢?就是说不管你有没有出现异常,它总会执行finally的代码。

5.3 throw和throws及自定义异常

package com.exception;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Mytest2 {
public static void readFile() throws ClassNotFoundException,FileNotFoundException{
	Class.forName("com.exception.Mytest2");
	FileInputStream fis=new FileInputStream("C://file.txt");
}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        try {
			readFile();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

}

笔记:throws用在声明方法的时候,告诉别人该方法有可能出现的异常,我没有处理,你调用的时候来处理。

现在我们来看另外一个关键字throw,throw就是抛出一个具体的异常,下面我们来模拟一个场景:

package com.exception;

public class UserInfo {
private String name;
private int age;
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getAge() {
	return age;
}
public void setAge(int age) throws Exception{
	if (age<18||age>60) {
		//使用throw抛出异常
		throw new Exception("用户的年龄只能是18到60岁之间");
	}
	this.age = age;
}
}
package com.exception;

public class Mytest3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        UserInfo user=new UserInfo();
        user.setName("张三");
        try {
			user.setAge(1);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


请添加图片描述

下面来讲自定义异常,以下是自定义异常的一个案例:

package com.exception;
//自定义的年龄不合理异常类
public class AgeErrorException extends Exception{
public AgeErrorException(String message) {
	super(message);
}
}
package com.exception;

public class UserInfo {
private String name;
private int age;

	public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) throws AgeErrorException{
	if (age<18||age>60) {
		throw new AgeErrorException("用户的年龄只能是18到60岁之间");
	}
	this.age = age;
}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        UserInfo user=new UserInfo();
        user.setName("张三");
        try {
			user.setAge(12);
		} catch (AgeErrorException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


请添加图片描述
总结:自定义异常是EXCEPTION异常的子类,所以必须要继承exception异常才行。

本章内容小节:throw和throws是另一种异常处理的方式,主要是将异常抛出由调用者来完成异常的处理,抛出异常一般和自定义异常配合的较多,以上就是关于Java异常处理的内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十的十七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值