您的位置:首页 > 职场人生

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

2015-09-23 16:54 477 查看
------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,可以有多个import。import导入的是包中的类,不导入包中的包。

(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包体现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: