黑马程序员-----Java基础-----异常

来源:互联网 发布:graphic软件 编辑:程序博客网 时间:2024/05/22 15:56

             -----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


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

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

对于问题的分析划分:两种一种严重问题,一种非严重问题
严重的:java通过Error
  对于error不编写针对性的代码进行处理
非严重:java通过Exception类进行描述。
  对于Exception可以针对性的处理方式进行处理。


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


Throwable是Error与Exception的父类


重要 异常的处理
java中提供了特有的语句进行处理,
try
{
需要被检测的代码
}
catch(异常量 变量)
{
处理异常的代码:处理方式。
}
finally
{
一定会执行的语句。
}

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

    String getMessagge();获取异常信息。
    String toString();异常名称,异常信息
    printStackTrace();异常信息,名称,位置
    其实JVM默认的异常处理机制,就是在调用printStackTrace方法。


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


对多异常的处理:
1,声明异常时,建议声明更为具体异常,这样处理的可以更具体。
2,对方声明几个异常,就对用有几个catch块。不要定义多余的。
如果多个异常块中的异常出现继承关系
父类异常catch块放在最下面。

建立在进行catch处理时catch中一定要定义具体处理方式
不要简单的定义一句e.printStackTrace();
也不要简单的就书写一句输出语句。

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

自定义异常:
需求:在本程序中,对于除数是负数也视为是错误的。无法运算。


挡在函数内部出现了throw抛出异常对象,那么必须要给对于的处理动作。
要么内部try catch处理
要么在函数上声明让调用者处理


一般情况在函数内出现异常,函数上需要声明。

class FushuException extends Exception
{

}
class Demo
{
int div(int a,int b) 
{
if(b< 0)
throw new FushuException();//手动通过throw关键字抛出一个自定义异常对象。
return a/b;
}
}
public class Exception {


public static void main(String[] args) {

Demo d = new Demo();
int x = d.div(4,1);

System.out.print("x="+x);
System.out.print("over");
}
}
--------------
class FushuException extends Exception
{

}
class Demo
{
int div(int a,int b)throws FushuException
{
if(b< 0)
throw new FushuException();
return a/b;
}
}
public class ExceptionDemo {


public static void main(String[] args) {

Demo d = new Demo();
try
{
int x = d.div(4,-1);
System.out.println("x="+x);
}
catch(FushuException e)
{
System.out.println(e.toString());
System.out.println("出现了负数");
}
System.out.println("over");
}
}


发现打印的结果中只有异常的名称,却没有异常的信息。
因为定义的异常未定义信息。
如何定义异常信息
因为父类中已经把异常信息的操作完成了。
所以子类只要在构造时,将异常信息传递给父类通过super语句。
那么久可以直接通过getMesseage方法获取异常信息。


注意;
必须是自定义类继承Exception。


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




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




class FushuException extends Exception
{
private String msg;
FushuException(String msg)
{
this.msg = msg;
}
public String getMessage()
{
return msg;
}
}
//上面这段代码完全可以用由下面的来代替。继承父类。
class FushuException extends Exception
{
FushuException(String msg)
{
super(msg);
}
}


class Demo
{
int div(int a,int b)throws FushuException
{
if(b< 0)
throw new FushuException("除数出现了负数");
return a/b;
}
}


RuntimeException
Exception 中有一个特殊的子类异常RuntimeException 运行时异常
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。


之所以不用再函数声明,是因为不需要让调用者处理。
当该异常发生。希望程序停止。因为在运行时,出现了无法继续运算的情况
希望停止程序后对代码进行修正。
class Person
{
public void chekName(String name)
{
if(name.equals("lisi"))//NullPointException
System.out.pringln("yes");
else
System.out.pringln("no");
}
}
main()
{
Person p = new Person();
p.chekName(null);
}


修正后:
class Person
{
public void chekName(String name)
{
//if(name.equals("lisi"))//NullPointException
if("lisi".equals(name))//if(name!=null&&name.equals("lisi"))
System.out.pringln("yes");
else
System.out.pringln("no");
}
}
main()
{
Person p = new Person();
p.chekName(null);
}


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


异常分两种:
编译时被检测异常;
编译时不被检测异常(运行时异常RuntimeException及其子类)。


finally :一定会执行
通常 用于关闭资源


异常在子父类覆盖中的体现
1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法
只能抛出父类的异常或者该异常的子类。
2,如果父类方法抛出多个异常,那么子类在覆盖方法时,只能抛出父类的异常子集。
3,如果父类或者接口与中的方法中没有异常抛出,那么子类在覆盖方法时
也不可抛出异常。
如果子类方法发生了异常,就必须严进行try处理,绝对不能抛。


练习


有一个圆形和长方形
都可以获取面积,对于面积出现非法数值,视为获取面积出现问题
问题通过异常表示。
对程序基本设计:面积可以用接口实现,异常不要用if,else,用异常。
class NoV extends RuntimeException//要用Exception就需要声明 thows NoV  并且做try处理。
{
NoV(String message)
{
super(message);
}
}
interface Shape 
{
void getArea();
}
class Rec implements Shape
{
private int len,wid;
Rec(int len,int wid)//throws NoV
{
if(len <= 0 ||wid <= 0)
throw new NoV("出现非法值");
this.len = len;
this.wid = wid;
}
public void getArea()
{
System.out.println(len*wid);
}
}
class Test
{
public static void main(String[]args)
{
//try
//{
Rec r = new Rec(3,9);
r.getArea();

Cir c = new Cir(-3);
c.getArea();
//}
//catch(NoV e)
//{
// System.out.print(e.toString());
//}
System.out.println("over");
}
}
class Cir implements Shape
{
private int R;
public static final double PI = 3.14;
Cir(int R)//throws NoV
{
if(R <= 0 )
throw new NoV("出现非法值");
this.R = R;

}
public void getArea()
{
System.out.println(R*R*PI);
}

}

                 ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


0 0
原创粉丝点击