饮水思源 -本文学习和总结自
异常的分类
- 检查时异常: 不处理此类异常,就无法进行编译。 在我们刚开始写程序的时候常常会碰到这种异常,比如经常讲将,英文
;
写成 中文;
。
- 运行时异常: 不处理可以通过编译,但是在运行时会抛出异常。下面的除数不能为零就只一个特别典型的运行时异常。他不会检查出来,可以通过编译,但是在运行的时候,就会在控制台抛出异常。
public class Program { public static void main(String[] args) { int value =0; int temp = 1/value; System.out.println(value); } }
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
Exception类
下图是我们的Exception类的结构
Exception 是所有异常的父类,所有的异常都从刺陵继承,包括我们的自定义异常
Error: 错误一般不会被处理,通常都会被实现出来,比如说
内存溢出
就是一个错误,而不是一个异常。
Java 中 常见的Exception
异常相关的方法
异常处理
我们在做的程序是让,用户来使用的,当一个异常没有被处理,那么他被呈现给用户了,。。。那么你的老板会好好找你谈谈的。所以我们要用异常处理处理掉我们的异常。
异常处理使我们的编程中重要的一种机制,可以增加我们程序的健壮性,增加用户友好度,比如说:程序崩溃了但是经过了处理,提示给用户一个
服务器忙!
的消息,和一个程序直接崩溃是完全不一样的。
try {
//可能发生异常的代码
}catch (Exception e) {
//如果发生异常的处理方式
}
//Demo
public class Program {
public static void main(String[] args) {
try {
int value =0;
int temp = 1/value;
System.out.println(value);
}catch (Exception e) {
System.out.println("除数不能为零!");
}
}
}
多重捕获
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
throw 和 throws关键字
- throw 一遍用来手动抛出隐藏
- throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
public static void readFile() throws Exception, IOException {
try {
File file = new File("不存在的Files");
FileInputStream inputStream = new FileInputStream(file);
} catch (Exception e) {
// 将异常向上抛出
throw e;
}
}
finally 关键字
- finally 一般用于做一些善后的处理,通常会被用来清理占用的资源。
- finally 代码块 不管是否发生异常都会执行
public static void readFile() throws Exception, IOException {
try {
} catch (Exception e) {
}finally {
//这里的代码不管是否发生异常都将被执行
}
}
自定义异常
有时候系统的异常并不能满足我们的需要,遇到这种情况我们需要,手动的定义一些异常。
- 新建一个类 继承
Exception
类。- 如果需要重写一些我们关心的方法。
- getMessage() 方法一般返回一些报错的详细信息。
- printStackTrace() 方法 打印一下异常的堆栈信息。
public class AgeException extends Exception {
@Override
public String getMessage() {
return "年龄不合法: 必须大于10,小于100";
}
@Override
public void printStackTrace() {
super.printStackTrace();
System.out.println("年龄不合法: 必须大于10,小于100");
}
}
使用自定义的异常
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.ReadOnlyFileSystemException;
public class Program {
public static void main(String[] args) {
try {
register("鲁迅认识的那只猹", -1);
}catch (AgeException e) {
//获取异常的提示信息
System.out.println(e.getMessage());
//打印堆栈
e.printStackTrace();
}
}
public static void register(String name, int age) throws AgeException {
if(age<=0||age>100) {
throw new AgeException();
}else {
System.out.println("注册成功!");
}
}
}
打印结果
年龄不合法: 必须大于10,小于100
AgeException: 年龄不合法: 必须大于10,小于100
at Program.register(Program.java:20)
at Program.main(Program.java:9)
年龄不合法: 必须大于10,小于100