黑马程序员_异常(一)

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ---------------------


异常概述
     异常就是程序在运行时出现的不正常情况。

    异常的由来:问题也是现实生活中一个具体事物,也可以通过java的类的形式进行描述,并封装成对象,其实就是java对不正常情况进行描述后的对象体现。
    对于问题的划分:两种 1.严重的 2.非严重的
        严重的:java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。
        非严重的:java通过Exception类进行描述。对于Exception可以使用针对性的处理方式进行处理。

    Error和Exception都具有共性内容

        Throwable
            |--Error
            |--Exception

异常try-catch
     java提供特有语句处理异常

        try
        {
            需要被检测的代码;
        }
        catch(异常类 变量)
        {
            处理异常的代码(处理方式);
        }
        finally
        {
            一定会执行的语句;
        }


class Demo
{
	int div(int a, int b)
	{
		return a/b;
	}
}
public class ExceptionDemo {
	public static void main(String[] args) {
		Demo d = new Demo();
		try
		{
			int x = d.div(4,0);
			System.out.println("x="+x);
		}
		//Exception e = new ArithmeticException();
		catch(Exception e)
		{
			System.out.println("除零了");
			System.out.println(e.getMessage());	//异常信息
			System.out.println(e.toString());	//异常名称:异常信息
			e.printStackTrace();	//异常名称,异常信息,异常出现的位置
			//JVM默认异常处理机制就是在调用printStackTrace
		}
		System.out.println("OVER");
	}
}

异常声明throws
     throws Exception
class Demo
{
	//在功能上通过throws关键字声明该功能可能会出现问题
	int div(int a, int b)throws Exception
	{
		return a/b;
	}
}
public class ExceptionDemo2 {
	public static void main(String[] args){
		Demo d = new Demo();
		int x;
		try {
			x = d.div(4,0);
			System.out.println("x="+x);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("OVER");
	}
}


多异常处理
     1.声明异常时,建议声明更为具体的异常,这样处理可以更具体。
   2.声明几个异常就对应几个catch块,不要定义多余的catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
    建议在进行catch处理时,catch中一定要定义具体处理方式,不要的简单定义一句e.printStackTrace(),也不要简单就书写一条输出语句。
class Demo
{
	//在功能上通过throws关键字声明该功能可能会出现问题
	int div(int a, int b)throws ArithmeticException,ArrayIndexOutOfBoundsException
	{
		int[] arr = new int[a];
		System.out.println(arr[4]);
		return a/b;
	}
}
public class ExceptionDemo3 {
	public static void main(String[] args){
		Demo d = new Demo();
		int x;
		try {
			x = d.div(4,1);
			System.out.println("x="+x);
		} 
		catch (ArithmeticException e) {
			System.out.println(e.toString());
			System.out.println("除零");
		}
		catch (ArrayIndexOutOfBoundsException e) {
			System.out.println(e.toString());
			System.out.println("角标越界");
		}
		System.out.println("OVER");
	}
}


自定义异常
     因为项目中会出现特有问题,这些问题并没有被java所描述并封装对象,所以对于这些特有的问题可以按照java对问题封装的思想,将特有异常进行自定义异常封装。

    当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作,要 在内部try catch处理,要么在函数上声明让调用者处理。
    一般情况下,函数内出现异常,函数上需要声明。
    发现打印的结果中只有异常的名称,却没有异常的信息,因为自定义的异常未定义信息。

    因为父类已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息通过super语句传递给父类,那么就可以直接通过getMessage方法获取自定义异常信息。
    自定义异常必须是自定义类继承Exception

    继承Exception原因:异常体系有一个特点,异常类和异常对象都被抛出,它们都具备可抛性,可抛性是throwable这个体系中独有的特点,只有这个体系中的对象和类才可以被throws和throw操作。

/*
需求:在本程序中,对于除数是负数,也视为错误,是无法进行运算的,那么就需要对这个问题进行自定义描述
*/
class FuShuException extends Exception	//自定义异常
{
	private int value;
	FuShuException(String msg,int value)
	{
		super(msg);
		this.value = value;
	}
	public int getValue()
	{
		return value;
	}
}
class Demo
{
	int div(int a, int b) throws FuShuException
	{
		if(b<0)
		{	//手动通过throw关键字抛出一个自定义异常对象
			throw new FuShuException("出现了除数是负数的情况",b);
		}
		return a/b;
	}
}
public class ExceptionDemo4 {
	public static void main(String[] args) {
		Demo d = new Demo();
		int x;
		try 
		{
			x = d.div(4,-1);
			System.out.println("x="+x);
		} catch (FuShuException e)
		{
			System.out.println(e.toString());
			System.out.println("错误的负数是:"+e.getValue());
		}
		System.out.println("OVER");
	}
}

throw和throws的区别
     1.throws使用在函数上,throw使用在函数内
    2.throws后面跟的是异常类,可以跟多个,用逗号隔开。throw后面跟的是异常对象。


RuntimeException
     Exception中特殊的子类异常 RuntimeException 运行时异常
    如果在函数内抛出该异常,函数上可以不用声明,编译可以通过。
    如果在函数上声明了该异常,调用者可以不进行处理,编译可以通过。
    之所以不用在函数上声明,是因为不需要让调用者处理,当该异常发生,希望程序停止,因为在运行时,出现了无法继续的情况,希望程序停止后,对代码进行修正。
    自定义异常时如果该异常的发生无法再继续进行运算,就让自定义的异常继承RuntimeException。
    对于异常,分两种
        1.编译时被检测的异常
        2.编译时不被检测的异常(运行时异常:RuntimeException及其子类)

class FuShuException extends RuntimeException
{
	FuShuException(String msg)
	{
		super(msg);
	}
}
class Demo
{
	int div(int a, int b)
	{
		if(b<0)
		{
			throw new FuShuException("出现负数");
		}
		if(b==0)
		{
			throw new ArithmeticException("被零除");
		}
		return a/b;
	}
}
public class ExceptionDemo5 {
	public static void main(String[] args) {
		Demo d = new Demo();
		int x = d.div(4,-7);
		System.out.println("x="+x);
		System.out.println("OVER");
	}
}


异常练习

class BlueScreamException extends Exception
{
	BlueScreamException(String message)
	{
		super(message);
	}
}
class SmokeException extends Exception
{
	SmokeException(String message)
	{
		super(message);
	}
}
class NoPlanException extends Exception
{
	NoPlanException(String msg)
	{
		super(msg);
	}
}
class Computer
{
	private int state = 3;
	public void run() throws BlueScreamException,SmokeException
	{
		if(state==2)
		{
			throw new BlueScreamException("蓝屏");
		}
		if(state==3)
		{
			throw new SmokeException("冒烟");
		}
		System.out.println("电脑运行");
	}
	public void reset()
	{
		state = 1;
		System.out.println("电脑重启");
	}
}
class Teacher
{
	private String name;
	private Computer cmpt;
	Teacher(String name)
	{
		this.name = name;
		cmpt = new Computer();
	}
	public void prelect() throws NoPlanException
	{
		try
		{
			cmpt.run();
		}
		catch(BlueScreamException e)
		{
			cmpt.reset();
		}
		catch(SmokeException e)
		{
			test();
			throw new NoPlanException("课时无法继续"+e.getMessage());
		}
		System.out.println("讲课");
	}
	public void test()
	{
		System.out.println("做练习");
	}
}
public class ExceptionTest {
	public static void main(String[] args) {
		Teacher t = new Teacher("T");
		try
		{
			t.prelect();
		}
		catch(NoPlanException e)
		{
			System.out.println(e.toString());
			System.out.println("换电脑");
		}
	}
}




----------------------ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值