(每日一转)黑马程序员----跟着老毕学Java之异常机制

异 常

概述:

是什么?是对问题的描述,将问题进行对象的封装。其实就是程序在运行时出现的不正常情况。

异常由来:问题也是现实生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种,一种是严重的问题,一种是非严重的问题。

对于严重的:java通过Error类进行描述。

对于Error一般不编写针对性的代码对其进行处理

对于非严重的,java通过Exception类进行描述。

对于Exception可以使用针对性的方式进行处理。

无论Error还是Exception都具有一些共性内容。

比如:不正常情况的信息,引发原因等。

异常体系:

Throwable

|--Error

|--Exception

|--RuntimeException

异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。也就是说可以被throw和throws关键字所操作。

只有异常体系具备这个特点。

----------------------

throw和throws的用法:

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个逗号隔开。

当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。

注意:RuntimeException除外,也就是说,函数内如果抛出的是RuntimeException异常,函数上可以不用声明。

RuntimeException

Exception 中有一个特殊的子类异常RuntimeException运行时异常。

如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。

如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。

之所以不用在函数上声明,是因为不需要让调用者处理,

当该异常发生, 希望该程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序

让程序员对代码进行修正。

自定义异常时,如果该异常的发生,无法再进行运算,就让自定义异常继承RuntimeException。

如果函数声明了异常,调用者需要进行处理。处理方式可以throws也可也try。

异常的分类

两种:

编译时被检测异常

该异常在编译时如果没有处理(没有throws也没有try),那么编译失败。

该异常被标识,代表着可以被处理。

运行时异常,(编译时不检测)

在编译时不需要处理,编译器不检查。

该异常发生,建议不处理,让程序停止,需要对代码进行修正。

----------------------

异常处理的语句:

try

{

需要被检测的代码:

}

catch()

{

处理异常的代码。

}

finally

{

一定会执行的代码。

}

有三个格式

1.

try

{

}

catch()

{

}

2.

try

{

}

finally

{

}

3.

try

{

}

catch()

{

}

finally

{

}

注意:

1.finally中定义的通常是关闭资源代码。因为资源必须释放。

2.finally只有一种情况不会执行。当执行到System.exit(0);finally不会执行。

自定义异常

为什么要自定义异常?因为项目汇总会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对这些特有的问题可以按照java的对问题封装的思想,将特有的问题,进行自定义的异常封装。

定义类继承Exception或者RuntimeException,原因如下:

1.为了让该在自定义类具备可抛性。

2.让该类具备操作异常的共性方法。

当要定义自定义异常的信息时,可以使用父类已经定义好的功能。

将异常信息传递给父类的构造函数。

class MyException extends Exception

{

MyException(Stringmessage)

{

super(message);

}

}

异常的好处

1.将问题进行封装。

2.将正常流程代码和问题处理代码相分离,方便阅读。

异常的处理原则:

1.处理方式有两种:try或者throws。

2.调用到抛出异常的功能时,抛出几个,就处理几个。

就出现了一个try对应多个catch

3.多个catch,父类的catch放到最下边。

4.catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace和输出语句。

也不要不写(因为如果出现问题,看不到问题所在)。

当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

try{

throw new AException();

}

catch(AException e)

{

throw e;

}

可以该异常处理不了,但并不属于该功能出现的异常,可以将该异常转换后,再抛出和该功能

相关的异常。

或者异常可以处理,但需要将异常产生和本功能相关的问题提供出去,让调用者知道并处理,也可以将异常处理后,转换成新的异常。

try{

throw new AException();

}

catch(){

//对AException处理,处理本层的异常

throw new BException();//抛出调用者所在层的相关异常。

}

异常的注意事项

在子父类覆盖时:

1.子类抛出的异常必须是父类的异常的子类或者子集。

2.如果父类或者接口没有异常抛出时,子类覆盖出现异常只能try不能抛。

示例1:老师用电脑上课

  1. package bxd.day09;
  2. /*
  3. 毕老师用电脑上课。
  4. 开始思考上课中出现的问题
  5. 比如问题是:
  6. 电脑蓝屏
  7. 电脑冒烟
  8. 要对问题进行描述,封装成对象。
  9. 可是当冒烟发生后,出现讲课进度无法继续,
  10. 出现了讲师的问题:课时计划无法完成。
  11. */
  12. class LanPingException extends Exception
  13. {
  14. LanPingException(String message)
  15. {
  16. super(message);
  17. }
  18. }
  19. class MaoYanException extends Exception//RuntimeException
  20. {
  21. MaoYanException(String message)
  22. {
  23. super(message);
  24. }
  25. }
  26. class NoPlanException extends Exception
  27. {
  28. NoPlanException(String msg)
  29. {
  30. super(msg);
  31. }
  32. }
  33. class Computer
  34. {
  35. private int state = 3;
  36. public void run() throws LanPingException,MaoYanException
  37. {
  38. if(state ==2)
  39. throw new LanPingException("蓝屏了");
  40. if(state ==3)
  41. throw new MaoYanException("冒烟了");
  42. System.out.println("电脑运行");
  43. }
  44. public void reset()
  45. {
  46. state = 1;
  47. System.out.println("电脑重启");
  48. }
  49. }
  50. class Teacher
  51. {
  52. private String name;
  53. private Computer cmpt;
  54. Teacher(String name)
  55. {
  56. this.name = name ;
  57. cmpt = new Computer();
  58. }
  59. public void prelect() throws NoPlanException
  60. {
  61. try
  62. {
  63. cmpt.run();
  64. }
  65. catch (LanPingException e)
  66. {
  67. cmpt.reset();
  68. }
  69. catch (MaoYanException e)
  70. {
  71. //throw e;
  72. test();//test()不能放在throw语句之后。
  73. throw new NoPlanException("课时无法继续"+e.getMessage());
  74. }
  75. System.out.println("讲课");
  76. }
  77. public void test()
  78. {
  79. System.out.println("练习");
  80. }
  81. }
  82. class ExceptionTest
  83. {
  84. public static void main (String [] args)
  85. {
  86. Teacher t = new Teacher("毕老师");
  87. try
  88. {
  89. t.prelect();
  90. }
  91. catch (NoPlanException e)
  92. {
  93. System.out.println(e.toString());
  94. System.out.println("换老师或者放假");
  95. }
  96. }
  97. }
package bxd.day09;
/*
毕老师用电脑上课。

开始思考上课中出现的问题

比如问题是:
电脑蓝屏
电脑冒烟

要对问题进行描述,封装成对象。

可是当冒烟发生后,出现讲课进度无法继续,

出现了讲师的问题:课时计划无法完成。


*/
class LanPingException extends Exception
{
	LanPingException(String message)
	{
		super(message);
	}

}
class MaoYanException extends  Exception//RuntimeException
{
	MaoYanException(String message)
	{
		super(message);
	}
}

class NoPlanException extends Exception
{
	NoPlanException(String msg)
	{
		super(msg);
	}
}

class Computer
{
	private int state = 3;
	public void run() throws LanPingException,MaoYanException
	{
		if(state ==2)
			throw new LanPingException("蓝屏了");
		if(state ==3)
			throw new MaoYanException("冒烟了");		
		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 (LanPingException e)
		{
			cmpt.reset();
		}
		catch (MaoYanException e)
		{
			//throw e;
			test();//test()不能放在throw语句之后。
			throw new NoPlanException("课时无法继续"+e.getMessage());	
		}
		System.out.println("讲课");	
		

	}

	public void test()
	{
		System.out.println("练习");
	}
}
class ExceptionTest
{
	public static void main (String [] args)
	{
		Teacher t = new Teacher("毕老师");
		try
		{
			t.prelect();
		}
		catch (NoPlanException e)
		{
			System.out.println(e.toString());
			System.out.println("换老师或者放假");
		}
		
	}
}


示例2:图形面积

  1. package bxd.day09;
  2. /*
  3. 有一个圆形和长方形
  4. 都可以获取面积,对于面积如果出现非法的数值,视为获取面积时出现的问题
  5. 问题通过异常表示。
  6. 现在对这个程序进行基本设计。
  7. try catch 可以把正常代码和异常处理代码分离开。
  8. */
  9. class NoValueException extends RuntimeException
  10. {
  11. NoValueException(String msg)
  12. {
  13. super(msg);
  14. }
  15. }
  16. interface Shape
  17. {
  18. void getArea();
  19. }
  20. class Rec implements Shape
  21. {
  22. private int len,wid;
  23. Rec(int len,int wid) //throws NoValueException
  24. {
  25. if(len<=0 || wid<=0)
  26. throw new NoValueException("出现非法值");
  27. this.len = len;
  28. this.wid = wid;
  29. }
  30. public void getArea()
  31. {
  32. System.out.println(len*wid);
  33. }
  34. }
  35. class Circle implements Shape
  36. {
  37. private double random;
  38. public static double PI = 3.14;
  39. Circle(double random)
  40. {
  41. if(random<=0)
  42. throw new NoValueException("半径出现非法值");
  43. this.random = random;
  44. }
  45. public void getArea()
  46. {
  47. System.out.println(random*random*PI);
  48. }
  49. }
  50. public class ExceptionTest1
  51. {
  52. public static void main(String[] args) //throws NoValueException
  53. {
  54. Rec r = new Rec(3,4);
  55. r.getArea();
  56. Circle c = new Circle(-3);
  57. c.getArea();
  58. System.out.println("over");//异常继承Exception时,该打印语句会执行;继承Runtime Exception时,该打印语句不执行
  59. }
  60. }
package bxd.day09;
/*
有一个圆形和长方形
都可以获取面积,对于面积如果出现非法的数值,视为获取面积时出现的问题
问题通过异常表示。

现在对这个程序进行基本设计。
 try catch 可以把正常代码和异常处理代码分离开。
*/
class NoValueException extends RuntimeException
{
	NoValueException(String msg)
	{
		super(msg);
	}
}

interface Shape
{
	void getArea();
}

class Rec implements Shape
{
	private int len,wid;
	Rec(int len,int wid) //throws NoValueException
	{
		if(len<=0 || wid<=0)
			throw new NoValueException("出现非法值");
		this.len = len;
		this.wid = wid;
	}
	public void getArea()
	{
		System.out.println(len*wid);
	}
}
class Circle implements Shape
{
	private  double random;
	public static double PI = 3.14;
	Circle(double random)
	{
		if(random<=0)
			throw new NoValueException("半径出现非法值");
		this.random = random;
	}
	public void getArea()
	{
		System.out.println(random*random*PI);
	}
}

public class  ExceptionTest1
{
	public static void main(String[] args) //throws NoValueException
	{
	
		
		Rec r = new Rec(3,4);
		r.getArea();	
		Circle c = new Circle(-3);
		c.getArea();

		System.out.println("over");//异常继承Exception时,该打印语句会执行;继承Runtime Exception时,该打印语句不执行
		
	}
}


package

包的作用:对类文件进行分类管理,给类提供多层命名空间,包也是一种封装形式。

注意事项package要写在程序文件的第一行,该程序文件中的类的全称是包名.类名。

对包中的类的调用

若使用package定义包,编译时没有问题;问题主要发生在调用时。

1. 在源文件目录下,编译后使用“java包名.类名”命令,会出现“wrong name”错误提示,这是由于编译时直接编译在了当前目录下,并没有创建你定义的包。
解决方法:
a.使用“javac –d .类名”,这时会在当前目录下创建定义的包,并把class文件存放用该包中;注意“.”前后要有空格。
b.使用“javac –d指定目录类名”,会在指定目录下创建包,这时会在指定目录下创建定义的包,并把class文件放在包中;同时还有把指定的目录加进classpath中,否则会出现找不到类错误。

2外部程序包使用包中的类时,该类必须使用类名.包名(否则会报“找不到符号”错误),且类必须是public(否则会出现无法访问提示)。

总结:包与包之间进行访问,被访问的包中的类即类中的成员用public修饰。

不同包中的子类还可以直接访问父类中被protected权限修饰的成员。

包与包之间可以使用的权限,只有publicprotected两种。

权限修饰符比较:

public

protected

default

private

同一个类中

同一个包中

×

子类

×

×

不同包中

×

×

×

import

import关键字作用:导入包中的类。

注意:1.导入包时,并不导入包中的子包,如需子包中的类,需要导入子包。

1. 建议不要使用“*”,只导入自己需要的类。

2. 如果两个包中有重名的类时,则该类必须加包名。

3. 为了避免包重复,建议使用urlurl地址反转)来完成定义包。

4. 包名要全部都是小写。

jar

jar包是java的压缩包,作用:方便项目的携带;方便使用,只要在classpath设置jar路径即可;数据库驱动,SSH框架等都是以jar包体现的。

使用方法:jar命令,例如“jar –cf haha.jar packa packb”即把包packapackb压缩成haha.jar文件;“jar –tf a.jar>c:\1.txt ”,把a.jar包中的详细信息写入1.txt文件中,注意dos窗口中“>”的使用。

Jar包相当于被压缩包的根目录,设置classpath=%classpath%;绝对路径\haha.jar,就可以使用指定目录下的haha.jar中的类。通过jar命令还可以实现双击运行功能(如果jar包中有main函数)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值