黑马程序员——Java语言基础:异常、包

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、异常

1.概念:程序在运行时出现不正常情况

2.由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。

    其实就是java对不正常情况进行描述后的对象体现。

3.问题的划分:

(1)严重的问题:Error(不编写针对性代码进行处理)

(2)非严重的问题:Exception(可使用针对性的方式进行处理)

4.异常体系:

Throwable

                |---Error

                |---Exception

5.异常的处理:

(1)java提供了特有的语句进行处理。

try

{

需要被检测的代码;

}

catch(异常类  变量)

{

处理异常的代码;(常见处理方式:String getMessage();)

}

finally

{

一定会执行的语句;

}

(2)throws和throw的用法:

throws定义在函数上,用于声明该功能可能会抛出异常,后跟异常类(可以抛出多个异常用逗号隔开)

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

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

※ RuntimeException除外,函数内如果抛出的RuntimeExcpetion异常,函数上可以不用声明。

(3)对多异常的处理:

a.声明异常时,建议声明更为具体得异常,这样处理的可以更具体

b.对方声明几个异常,就对应有几个catch块

c.如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面

d.进行catch处理时,catch中一定要定义具体处理方式

6.自定义异常:

(1)因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象,所以需要将特有的问题,进行自定义的异常封装。

(2)自定义异常信息:

      要定义自定义异常的信息时,可以使用父类已经定义好的功能,将异常信息传递给父类的构造函数。因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类通过super语句,那么就可以直接通过getMessage()方法获取自定义的异常信息。

(3)自定义异常:

必须是自定义类有继承关系,通常继承Exception。

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

7.异常处理练习:模拟借书系统


package books;
import java.util.*; 

public class bookLend 
{ 
	//throws 使用在函数上,后面跟的是异常类,可以跟多个,用逗号隔开
	//throw 使用在函数内,后跟的是异常对象
	// 定义图书数组  
	public List<Books> allBooks;
	public bookLend()
	{
	this.allBooks = new ArrayList<Books>();
	} 
	// 查询方法  
	public void inquery() throws Exception 
	{  
		Books[] books = {new Books(1,"数据结构"),new Books(2,"C语言"),
				 new Books(3,"JAVA"),new Books(4,"大学语文")};
		allBooks.addAll(Arrays.asList(books));
		// 进入系统 
		System.out.println("欢迎登录模拟借书系统!"); 
		// 选择查询类型 
		System.out.println("输入命令:1-按照名称查找图书;2-按照序号查找图书"); 
		try 
		{  
			Scanner sc = new Scanner(System.in); 
			int index = sc.nextInt();
			//输入1,则按书名查找
			if(index==1)
			{
				System.out.println("输入图书名称:");
				checkName(); 
			}
			//输入2,则按序号查找
			else if(index==2)
			{
				System.out.println("输入图书序号:");
				checkSerial();
			}
			else
			{
				System.out.println("请输入正确序号!");
				inquery();
			}
		}catch (InputMismatchException e) 
		{  
			System.out.println("输入命令错误,请重新输入"); 
			inquery();
		} 
		catch (ArrayIndexOutOfBoundsException e) 
		{  
			// 输入的序号不存在(引发"数组下标越界异常"),则抛出"图书不存在!" 
			System.out.println(e.toString());
			inquery();
		}
		catch (Exception e)
		{
			System.out.println(e.toString());
			inquery();
		}
	}
	//按书名查找图书
	public void checkName() throws Exception
	{ 

		Scanner sc = new Scanner(System.in); 
		String st = sc.next();
		boolean isFinded = false;
		for (int i = 0; i < allBooks.size(); i++)
		{

 			// 如输入书名正确,则返回该位置图书信息
			Books bk = allBooks.get(i);
			if (st.equals(bk.bookName))
			{  
				System.out.println("序号: " + bk.bookNum + "\t" + "书名: " +bk.bookName);
			}		
		} 
		throw new noExist("图书不存在!");
	}  
	// 按照编号查找图书  
	public void checkSerial()  throws Exception
	{  
		Scanner sc = new Scanner(System.in); 
		int bookSerial = sc.nextInt();
		// 如输入序号正确,则输出该位置图书信息 
		for (int i = 0; i < allBooks.size(); i++)
		{ 
			Books bk = allBooks.get(i);
			if (bookSerial == bk.bookNum)
			{  
				System.out.println("序号: " + bk.bookNum + "\t" + "书名: " + bk.bookName);
			}
		}
		throw new noExist("图书不存在!");
	}
	public static void main(String[] args) throws Exception 
	{ 
		bookLend bl = new bookLend();
		bl.inquery(); 
	}

}

//Book类
package books;
public class Books 
{
	public int  bookNum;
	public String bookName;
	public Books(int bookNum,String bookName)
	{
		this.bookNum = bookNum;
		this.bookName = bookName;
	}
	public Books(){}
}

//异常处理类
package books;
public class noExist extends Exception 
{
	public noExist()
	{
		super();
	}
     
	public noExist(String message)
	{
		super(message);
	}    
}

 二、包

1.package

        在java中,管叫包,相当于文件夹。包里通常存放的是类文件,因为我们在编写程序的时候,难免会有类名相同的情况,就如人名一样。为了对类进行分类管理,java就有了包的出现,在不同包中可以有相同的类名,调用的时候连同包名一起即可。

        包也是一种封装形式。在包中可以有很多类文件,但是只提供一个类文件,供外界使用。

 

2.包的作用

(1)为避免多个类重名的情况,如果出现两个相同名字的类,可通过包将两者区分,从而避免冲突。

(2)对类文件进行分类管理,可以将相关的一些类放在同一个包中。

(3)给类提供多层命名空间,如a包中的Demo.class文件,如果要创建Demo对象,就要在使用时加上a.

例如:a.Demo d=new a.Demo();

(4)包的出现可以将java的类文件和源文件相分离。

 

3.规则      

(1)包必须写在程序的第一行。因为要先有包,才知道类文件的存放地方。

(2)类的全称:包名.类名。

(3)编译定义了包的程序文件时,在编译时要指定包的存储目录。

如:javac –d E:\mypack类名.java

4.包之间的访问      

(1)要访问其他包中的类,需要定义类的全称:包名.类名。

(2)包如果不在当前路径,需要使用classpath设定环境变量,为JVM指明路径。

(3)被访问的包中的类权限必须是public的。

(4)类中的成员权限:public或者protected。protected是为其他包中的子类提供的一种权限。

类公有后,被访问的成员也要公有才可以被访问。

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

同一个包中,protected只作用为覆盖。

四种权限

 

public

protected

defauld

Private

同一类中

可以

可以

可以

可以

同一包中

可以

可以

可以

不可以

子类

可以

可以

不可以

不可以

不同包中

可以

不可以

不可以

不可以

※ 一个.java文件里面,不能出现两个以上的公有类或者接口。因为被public修饰的类名必须与java文件名相同。

5.包的导入——import

(1)可以简化类名。在调用其他包中的类时,需要写类的全称,也就是连同包名一起书写。

当类存在多层包中时,如:haha.hehe.pack.Demo,使用import导入后,使用其类时,就可以不加包名了。

导入格式如:import haha.hehe.pack.Demo;

(2)一个程序文件中只有一个package,可以有多个importimport导入的是包中的类,不导入包中的包。

(3)注意事项:

a,在导入包时,如果包中有很多类,可以使用通配符 *来替代包中的所有类。但是,建议不要使用通配符 * 

     因为将不需要使用的类导入后,会占用内存空间。所有在编写程序时,要使用包中的哪些类,就导入哪些类。

b,定义包名不要重复,可以使用url来完成定义,url是唯一的。如:package cn.itheima.Demo。

c,导入的不同包中有相同类时,必须写类的全名以区分,否则将会报错。

6.jar包

(1)类越来越多时,我们可以用包来装,当包越来越多时,我们可以将包进行压缩。java中用jar这个工具来对包进行压缩。

压缩后的后缀名为jar。

(2)jar.exe工具的一些命令:

创建jar包:jar  -cvf  mypack.jar packa packb

查看jar包:jar  -tvf  mypack.jar  [>定向文件]

解压缩:jar  -xvf  mypack.jar

自定义jar包的清单文件: jar cvfm  mypack.jar mf.txt  packa packb

(3)jar 包的好处:

a.可以将多个包进行压缩到为一个文件。方便项目的携带。

b.方便于使用,只要在classpath设置jar路径,即可以执行jar包中的java程序。

c.数据库驱动,SSH框架等都是以jar包体现的。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值