异常的概念

异常( Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中 断正在运行的程序

所需文件找不到
网络连接不通或中断
算术运算错(被零除……)
数组下标越界
装载一个不存在的类或者对null对象操作
类型转换异常
……
当Java程序出现以上的异常时,就会在所处的方法中产生一个异常对象。这个异常对象包括异常的类型,异常出现时程序的运行状态以及对该异常的详细描述。

层次结构
异常机制和处理

异常分类

异常机制和处理

 

异常处理的方式

Error错误

Error表明系统JVM已经处于不可恢复的崩溃状态中。我们不需要管它。

异常机制和处理

Exception异常

处理方法一、捕获异常

try catch:

使用方法:

try{
    //代码段
}catch(异常类型){
    //对异常进行处理的代码段
}

如果不使用:

异常机制和处理

使用了:提示除数不能为0

异常机制和处理

package cn.xjion.pro07;

import java.util.Scanner;

/**
 * 测试try catch的用法
 * @author xjion
 *
 */
public class TestTrycatch {
	public static void main(String[] args) {
//		获取控制台
		Scanner sc = new Scanner(System.in);
//		捕获异常
		try{
//			用户输入和接收
		System.out.println("请输入被除数");
		int numA = sc.nextInt();
		System.out.println("请输入除数");
		int numB = sc.nextInt();
//		计算商
		int result = numA/numB;
//		打印
		System.out.println(result+"="+numA+"/"+numB);
//		解决异常
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}

try finally

finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。

package cn.xjion.pro07;

import java.util.Scanner;

/**
 * 测试try finally
 * @author xjion
 *
 */
public class TestTryFinally {
	public static void main(String[] args) {
//		控制台
		Scanner sc = new Scanner(System.in);
//		捕获
		try{
//			输入,接收
			System.out.println("请输入被除数");
			int numA = sc.nextInt();
			System.out.println("请输入除数");
			int numB = sc.nextInt();
//			商
			int result = numA/numB;
//			打印
			System.out.println(numA+"/"+numB+"="+result);
//			finally语句
		}finally{
			System.out.println("finally的代码");
		}
	}
}

try catch finally

正常情况:执行try-finally
异常情况:类型相匹配,执行try-catch-finally
异常情况:类型不相匹配,执行try-finally
如果在 catch 中存在 return 语句,则先执行完 finally 语句 再回头执行 return 语句

这个代码可以先不敲,后面的IO流中有,而且是经典代码

package cn.xjion.pro07;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * 测试一个经典代码,测试try catch finally
 * @author xjion
 */
public class TestTrycatchfinally {
	public static void main(String[] args) {
//		创建字符输入流
		FileReader reader = null;
//		捕获
		try {
//			导入文件字符
			reader = new FileReader("D:\\a.txt");
			char c = (char)reader.read();
			char c2 = (char)reader.read();
//			处理
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
				try {
//					如果读取的不是空的就关闭流
					if(reader != null){
					reader.close();
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
	}
}

异常处理方式二、申明异常throws

当CheckedException产生时,不一定立刻处理它,可以再把异常throws出去。

在方法中使用try-catch-finally是由这个方法来处理异常。但是在一些情况下,当前方法并不需要处理发生的异常,而是向上传递给调用它的方法处理。

如果一个方法中可能产生某种异常,但是并不能确定如何处理这种异常,则应根据异常规范在方法的首部声明该方法可能抛出的异常。

如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。

方法重写中声明异常原则:子类重写父类方法时,如果父类方法有声明异常,那么子类声明的异常范围不能超过父类声明的范围。

package cn.xjion.pro07;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * 测试throws
 * @author xjion
 */
public class TestThrows {
	public static void main(String[] args) throws IOException {
//		创建字符输入流
		FileReader reader = null;
//			导入文件字符
			reader = new FileReader("D:\\a.txt");
			char c = (char)reader.read();
			char c2 = (char)reader.read();
	}
}
package cn.xjion.pro07;
public class TestThrows1 {
//	show方法抛出异常
	public static void show() throws Exception{
		
	}
//	method方法抛出异常
	public static void method() throws RuntimeException{
		
	}
//	main方法
	public static void main(String[] args) {//throws Exception
		try {
			show();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		method();
	}	
}

在继承关系中

父类的方法声明了Exception类型的异常,子类在重写方法时,可以申明也可以不声明。但是如果子类重写方法后的方法使用super关键字调用父类的方法,那么要求必须对异常进行处理。

package cn.xjion.pro07;
public class Father {
//	父类show方法
	public void show() throws Exception{
		
	}
}
//子类
class Son extends Father{
//	重写并调用父类方法
	@Override
	public void show() throws Exception  {
		super.show();
	}
}

如果父类的方法没有异常,那么子类的方法如果一定会有Exception或Checked异常,要求子类必须自己使用try-catch处理,或者给父类方法加上异常的声明

如果子类在重写父类的方法时,产生的异常时RuntimeException异常时,那么可以不用处理。

package cn.xjion.pro07;
public class Father1 {
	
	public void fun() {
		
	}
}
class Son1 extends Father1{

	public void fun() throws RuntimeException{
		// TODO Auto-generated method stub
		super.fun();
	}
}

throw抛出异常对象

我们把抛出异常对象的这个过程也称作手写throw抛出异常

public class TestThrow {
	public static void show() {
		try {
			throw new Exception();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		show();
	}
}

throws与throw区别

  1. throws用于声明方法可能会产生的异常类型
    throw手动抛出异常对象
  2. throws写在方法名称后面
    throw用于写在方法里

常见的异常类型及解决办法

运行时异常RuntimeException

算术异常ArithmeticException

		int b = 0;
		if(b != 0) {
			int result = 1/b;
		}else {
			System.out.println("除数不能为0");
		}

空指针异常NullPointerException

		String str = null;
		if(str != null) {
			System.out.println(str.length());
		}

类型转换异常ClassCastException

		//类型转换异常
		Animal dog = new Dog();//向上类型转换
		if(dog instanceof Cat) {
			Cat c = (Cat)dog;//向下类型转换,转换成真实的子类对象
		}

数组下标越界ArrayIndexOutOfBoundsException

		int[] arr = {11,22,33};
		int index = 3;
		if(index < arr.length) {
			System.out.println(arr[index]);
		}else {
			System.out.println("数组下标越界了");
		}

类型不匹配InputMI是matchException

		Scanner input = new Scanner(System.in);
		if(input.hasNextInt()) {
			int a = input.nextInt();
			System.out.println(a);
		}else {
			System.out.println("输入的类型与期望的类型不匹配");
		}

检查时异常

SQLException

IOException

ParseException

必须做处理

throws向上抛

或者try catch finally

public static void main(String[] args) {
		//检查时异常,N多个程序在编译期间必须处理的异常的总称
		File f = new File("D:\\a.txt");
		try {
			f.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

自定义异常

1.在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。

2.自定义异常类只需从Exception类或者它的子类派生一个子类即可。

3.自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。

4.习惯上,自定义异常类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。

步骤:

1、继承Exception或者RuntimeException

2、定义构造方法

3、使用

设置异常

package cn.xjion.pro07;
public class SexException extends Exception{
//无参构造器
	public SexException() {
		super();
		// TODO Auto-generated constructor stub
	}
//带参构造器
	public SexException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}
	
}

使用

package cn.xjion.pro07;

import java.util.Scanner;

public class TestSexException {
	public static void main(String[] args) {
//		控制台,输入,接收
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入您的性别");
		String gender = sc.next();
//		判断性别
		if("男".equals(gender)||"女".equals(gender)) {
			System.out.println("性别录入正确");
		}else {
//			不正确时就会弹出只能是男和女
			try {
				throw new SexException("性别只能是男或者女");
			} catch (SexException e) {
//				打印
				System.out.println(e.getMessage());
			}
		}
	}
}

 

好了,异常的知识基本上就这么多了,有不对的地方望大佬们指出^_^!

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章: