首页 > 技术文章 > Java-异常处理机制

slyfox 2017-08-01 20:14 原文

饮水思源 -本文学习和总结自

菜鸟教程

异常的分类

  • 检查时异常: 不处理此类异常,就无法进行编译。 在我们刚开始写程序的时候常常会碰到这种异常,比如经常讲将,英文;写成 中文

  • 运行时异常: 不处理可以通过编译,但是在运行时会抛出异常。下面的除数不能为零就只一个特别典型的运行时异常。他不会检查出来,可以通过编译,但是在运行的时候,就会在控制台抛出异常。
public class Program {
	public static void main(String[] args) {
		int value =0;
		int temp = 1/value;
		System.out.println(value);
	}
}

  • 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

Exception类

下图是我们的Exception类的结构

img

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

推荐阅读