Java中的异常处理

1.认识异常

一个程序在编译时没有出现错误,但是在运行过程中有可能由于各种各样的错误导致程序退出,这些错误就被称为异常。Java中提供了异常处理的机制。

在Java中这些异常其实就是一个类,异常的根类是java.lang.Throwable ,下面介绍一下异常的继承结构:

Throwable
object
Exception
Error
RuntimeException
IOException
更多的类
ArithmeticException
NullPointerException
更多的类
异常可以分为三种主要类型:系统错误(Error)、异常(Exception)、运行时异常(RuntimeException)

Error:指的是JVM错误,这时的程序没有执行,所以无法处理。
Exception:指的是程序运行过程中产生的异常,用户可以使用异常处理格式处理。
RuntimeException:程序在编译时不会强制性地要求用户处理的异常,如果出现异常将交由JVM默认处理。

2.异常处理流程

异常处理格式:

try{
	//有可能出现异常的语句
}catch(异常类型 对象){
	//异常处理
}fianlly{
	//无论是否出现异常,都执行的内容
}

程序示例:异常处理

import java.util.Scanner;

public class Test6_3 {
	public static void main(String args[]) {
		System.out.println("1.除法计算开始!");
		Scanner input = new Scanner(System.in);
		int x = input.nextInt();
		int y = input.nextInt();
		try {
			System.out.println("2.除法计算:"+x/y);
			System.out.println("##########");
		}catch(ArithmeticException e) {
			//System.out.println("第二步出现了异常!");
			e.printStackTrace();
			
		}finally {
			System.out.println("##########不管是否发生异常,都要输出");
		}
		
		System.out.println("3.计算完成。");
		input.close();
	}
}
程序运行结果:
			1.除法计算开始!
			10
			0
			java.lang.ArithmeticException: / by zero
				at unit_6.Test6_3.main(Test6_3.java:14)
			##########不管是否发生异常,都要输出
			3.计算完成。
	
3.声明异常(throws)、抛出异常(throw)
(1)throws关键字

throws关键字在方法的定义上使用,表示此方法不进行异常处理,将异常交给被调用处处理。
程序示例:

class MyMath{
	public static int div(int i,int j) throws Exception{
		return i/j;
	}
}
public class Test{
	public static void main(String[] args){
		//div方法声明了异常,必须进行异常处理
		try{
			System.out.println(MyMath.div(10,2));
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
(2)throw关键字

使用throw关键字手工抛出一个异常类对象。

public class Test{
	public static void main(String[] args){
		try{
			throw new Exception("自己定义的异常。");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
4.assert关键字 断言操作(了解)

在JDK1.4的时候引入,主要功能是断言。断言是指程序在执行到某行之后,其结果一定是预期的结果。
在默认情况下Java不开启断言,如果需要,则进行手动启用。

  • 命令行中:java -ea Test
  • Eclipse中:右键单击类找到Run As —> Run configurations-就出现如下界面,配置即可
    在这里插入图片描述
5.自定义异常

Java本身提供了很多种异常,但是在实际开发中这些不够用,需要开发者自定义异常。如果要实现自定义异常只需要继承Exception 或RuntimeException父类即可。

程序示例:自定义异常

@SuppressWarnings("serial")
class AddException extends Exception{

	public AddException(String msg){
		super(msg);
	}
}
public class Test_AddException {
	public static void main(String args[]) {
		int num = 20;
		try {
			if(num>10) {
				throw new AddException("数据传递的过大!");
			}
		}catch(Exception e) {
				e.printStackTrace();
		}
		
	}
}
程序运行结果:
			unit_6.AddException: 数据传递的过大!
				at unit_6.Test_AddException.main(Test_AddException.java:14)
6.链式异常
与另一个异常一起抛出一个新的异常,构成了链式异常。

程序示例:链式异常

/*
 * 链式异常
 */
package unit_12;

public class Program12_9 {
	public static void main(String args[]) {
		try {
			method1();
		}catch(Exception ex) {
			ex.printStackTrace();
		}
	}
	public static void method1() throws Exception{
		try {
			method2();
		}catch(Exception ex) {
			throw new Exception("New unfo from method1",ex);
		}
	}
	public static void method2() throws Exception{
		throw new Exception("New info from method2");
	}
}
程序运行结果:
			java.lang.Exception: New unfo from method1
				at unit_12.Program12_9.method1(Program12_9.java:18)
				at unit_12.Program12_9.main(Program12_9.java:9)
			Caused by: java.lang.Exception: New info from method2
				at unit_12.Program12_9.method2(Program12_9.java:22)
				at unit_12.Program12_9.method1(Program12_9.java:16)
				... 1 more
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值