黑马程序员——异常与包

------- android培训java培训、期待与您交流! ----------

一.异常

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

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

 

把问题封装成对象就是异常

 

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

 

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

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

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

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

 

异常的处理

java提供了特有的语句进行处理

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


 

例子

class Demo
{
    intdiv(int a, int b)
    {
        returna/b;
    }
}
class ExceptionDemo
{
    publicstatic void main(String[] args)
    {
        Demod = new Demo();
        try
        {
            intx =d.div(4,0);    //此处如果执行错误,就会执行catch,如果无误,则照常执行
            System.out.println("x="+x);
        }
        catch(Exception e)//Exception e =new AritchmeticException();多态
        {
            System.out.println("除零错误啦");
        }
        System.out.println("over");
    }
}


结果

 

除零错误啦
Over

当try处4/0时(数字不能除以零),出错,java虚拟机识别,产生了AritchmeticException,并把这个问题封装成了一个对象newAritchmeticException(),抛给了调用这个功能的调用者(上例中是主函数在调用)。然后try检测到了这个对象后,把它丢给了catch。catch通过定义的参数接收。上例中就变成了Exception e =new AritchmeticException();,然后执行了处理代码。

就好比老师上课中,手破了,本来不能上课了,贴了一个创口贴(try catch),就可以继续上课

 

对捕获到的异常对象进行常见方法操作

String getMessage():获取异常信息

在上例中除零错误啦后面添加一句

System.out.println(e.getMessage());

结果/ by zero

 

toString(): 异常名称: 异常信息

 

printStackTrace(): 异常名称,异常信息,异常出现的位置

 

其实jvm默认的异常处理机制,就是在调用printStackTrace方法,

打印异常的堆栈的跟踪信息

 

throws

上例中

class Demo
{
    intdiv(int a, int b)throws Exception
    {
        returna/b;
    }
}


throws Exception 意思是说:在功能上通过throws的关键字声明了该功能有可能会出现问题。

在函数上声明异常,便于提高安全性,让调用出进行处理。不处理编译失败

(比如知道地上某处埋着个炸弹,声明异常就是在炸弹处标示一下,要进行处理,不处理就可能会爆炸)

 

对多异常的处理

 

1、声明异常时,建议声明更为具体的异常,这样处理额可以更具体。

如 throws ArithmeticException,ArrayIndexOutOfBoundsException

声明几个异常,就要写几个catch

catch(ArithmeticException e)
{}
catch(ArrayIndexOutOfBoundsException e)
{}


 

2、对方声明几个异常,就对应有几个catch块。不要定义多余的catch块

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

 

建议在进行catch处理时,catch中一定要定义具体处理方式

不要简单定义一句e.printStackTrace(),

也不要简单的就书写一条输出语句

 

自定义异常

自定义的问题描述成为自定义异常

注意:如果让一个类成为异常类,必须要继承异常体系,因为只有成为异常体系的子类才有资格具有可抛性。才可以被两个关键字所操作,throws,throw

class FuShuIndexException extendsException
{
    FuShuIndexException()
    {}
}


自定义异常时,要么继承Exception,要么继承RuntimeException

 

异常的分类

1、编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系

这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方法。

这样的问题都可以针对性的处理

2、编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类

这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的,或者引发了内部状态的改变导致的。

那么这种问题一般不处理,直接编译通过,让调用者调用时的程序强制停止,让调用者对代码进行修正。

 

throws和throw区别

1、throws使用在函数上

throw使用在函数内

2、throws抛出的是异常类,可以抛出多个,用逗号隔开

throw抛出的是异常对象

 

try catch的三种格式

1

try
{}
catch() //多个 当没有必要资源需要释放时,可以不用定义fianlly
{}


2

try
{}
catch()
{}
finally
{}


3、异常无法直接catch处理,但是资源需要关闭

try
{
    //开启资源
    thrownew Exception();
}
finally
{
    //关闭资源
}


 

异常处理的原则

1、函数内部如果抛出需要检测的异常,那么函数上必须声明

否则必须在函数内用try catch捕捉,否则编译失败

2、如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败

3、什么时候catch,什么时候throws呢?

功能内部能够解决,用catch

解决不了,用throws告诉调用者,由调用者解决

4、一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性处理。

内部有几个需要检测的异常,就抛出几个异常,抛出几个就catch几个

 

异常的注意事项

1、子类在覆盖父类方法时,父类的方法如果抛出了异常,

那么子类的方法只能抛出父类的异常或者该异常的子类(或不抛)

2、如果父类抛出多个异常,那么子类只能抛父类的子集

 

简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,只能try。

 

 

二.包

包的作用:

  区分相同名字的类

  良好的管理大量的类

  控制访问范围

打包命令:

  package com.name

命名规范:

小写字母

 

1、包的声明

  为了声明一个包,首先必须建立一个相应的目录结构,子目录与包名一致。然后在需要放入该包的类文件开头声明包,形式为:

package 包名;

 

这样,在这个类文件中定义的所有类就都被装入到您所希望的包中了,例如:

package bookexample; class A{ …… }class B extends A{ …… } public class OverrideExample{ …… }


不同的程序文件内的类也可以同属于一个包,只要在这些程序文件前都加上同一个包的说明即可。


2、包的使用

在Java中,为了装载使用已编译好的包,通常可使用以下3种方法:

(1)在要引用的类名前带上包名作为修饰符。例如:

  

bookexample.A objA =new bookexample.A();

其中bookexample是包名,A是包中的类名,objA是类的对象。


(2)在文件开头使用import引用包中的类。例如:

import bookexample.A; class Example{ AobjA = new A(); }


同样,bookexample是包名,A是包中的类,objA是创建的A类对象。


(3)在文件前使用import引用整个包。例如:

import bookexample.*; class Example{ AobjA=new A(); }


bookexample整个包被引入,A是包中的类,objA是创建的A类对象。

在使用包时,可以用点“.”表示出包所在的层次结构,用“.*”表示该目录结构下的所有内容。

需要指出的是,java.lang这个包无需显式引用,它总是被编译器自动调入。使用包时还要特别注意系统classpath路径的设置情况,它需要将包名对应目录的父目录包含在classpath路径中,否则编译时会出错,提示用户编译器找不到指定的类。


包与包之间的类进行访问:

被访问的包中的类必须是public,

被访问的包中的类方法也必须是public

 

 同一类中同一包中子类中不同包中
公共 public
保护 protected×
default(什么不写,默认权限)×
私有 private×××

protected/*保护,也是一种封装*/这种权限只有不同包中的子类(必须要继承)可以使用。直接创建对象不行

简化包写法用导入



导包的原则:用到哪个类,就导入哪个类

import packa.DemoA; //导入packa包中的DemoA类
import packa.*;//导入了packa包中所有的类

Jar包可以直接设置classpath

如classpath =./xxx.jar    //.就是当前目录


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值