0905-090x 异常

异常:程序在运行中出现的不正常情况。
异常的由来:问题也是现实生活中的具体事务,也可以通过java的类的形式进行描述并封装成对象。

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

对于严重的,java通过error类进行描述如classpath exception,空指针,越界。
对于error一般不用编写针对性的代码对其进行处理。

对于非严重的,java通过exception类进行描述。
对于exception可以使用针对性的处理方式进行处理。

无论是error还是exception都具有一些共性内容,比如:不正常情况的信息,引发原因等。

抽取出来的父类叫做:
throwable 
|----Error
|----Exception

------------------------------------------------------------------------------------------------------------------
2.异常的处理
java提供了特有的语句进行处理。

try{
需要被检测的、可能会出错的代码
}catch(异常类变量)
{
处理异常的方案
}
finally{
一定会执行的语句
}

本来如果没有这个处理机制的时候,main函数无法处理异常,只能丢个java虚拟机来处理,而java虚拟机会使用它自己的异常处理机制——抛出问题。停滞程序
0905-090x <wbr>异常

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

class Demo
{
int div(int a,int b)
{
return a.b;
}
}

class ExceptionDemo
{
public static void main(String[] args)
{
Demo d = new Demo();
try {
int x = d.div(4.0);
System.out.println("x="+x);
}
catch(Exception e)
{
System.out.println("除〇";)
System.out.println(e.getMessage());// / by zero
System.out.println(e.toString());
e.printStackTrace();//异常名称,异常信息,异常出现位置
//其实jvm默认的异常处理机制就是在调用printStackTrace,打印异常的跟踪信息。
}
}

System.out.println("over");
}

如果事先预测到可能会发生问题,要自己定义抛出的异常
编写功能的人可以在功能上添加标识.


class Demo
{
int div(int a,int b )throws Exception
{
  return a/b;
}//在功能上通过throws的关键字声明了该功能可能会出现问题
}

class ExceptionDemo1{
public static void main(String[] args)
{
Demo d = new Demo();
int x = d.div(4,1)

System.out.println("x="+x);
}
}

比喻:
有个面包。放了三天,老板于是在面包上放了个标签。[此面包可能已经放坏。]

调用者一看,可能有问题,于是就throws走了,如果一直throws,会最终到达jvm。

关于抛出和处理:

class   Demo
{
int div(int a,int b) throws Exception
{
return a/b;
}
}

class ExceptionDemo1
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(4,0);
System.out.println("x="+x);
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}
-------------------------------------------------------------------------------------------------------------------
多异常处理
1.声明异常的时候,建议声明更具体的异常,这样可以处理的更具体。
2.声明几个异常,就对应有几个catch块。如果多个catch块中的异常出现继承关系,应该把父类catch放在后面。
  不要定义多余的catch块。

建议在进行catch处理的时候,catch中一定义具体处理方式。不要直接写输出或者e.printStackTrace().
怎么办?
首先,使用硬盘文件记录下来。(异常日志文件)
然后找一个具体的解决方案。
class   Demo
{
int div(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsExc eption
{
return a/b;
}
}

class ExceptionDemo1
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(4,0);
System.out.println("x="+x);
}
catch(Exception   ArithmeticException)
{
System.out.println(e.toString());
}
catch(Exception  ArrayIndexOutOfBoundsException)
{
System.out.println(e.toString());
}
}
}
谁出错跳谁。抛几个就有几个catch。
---------------------------------------------------------------------------------------------------------------
自定义异常
我们做项目的时候可能会出现特有的、未被java所描述的异常。
对于这些特有问题,可以按照java对问题的封装套路,将特有问题进行自定义的异常封装。

自定义异常:
需求:在本程序中,对于除数是-1,也是为是错误的无法进行运算的。
那么就需要对这个问题进行自定义描述。

class FuShuException extends Exception
{

}

自定义的,需要手动建立对象,手动抛出。
当在函数内部出现了throw抛出异常对象,那么必须就要给出对应的处理方案(catch)
要么在内部try catch,要么在函数上声明让调用者处理

一般情况下,函数内出现异常,函数上需要声明,【特殊】

发现打印的结果中只有异常的名称,却没有异常的信息。
因为自定义的异常中没有自定义信息。复写即可。

如果父类中已经把异常信息的操作都完成了,所以子类直接通过getMessage方法获取自定义的异常信息。

自定义异常:
必须自定义类继承Exception。

为什么继承exception而不是throwable?
异常体系有一个特点:因为异常类和异常对象都被抛出。 因为他们都具有可以被抛出的特性。这个可抛出性是throwable这个体系中独有的特点。只有这个体系中的类和对象才可以被throws和throw操作。
class FuShuException extends Exception
{
private String msg;
FuShuException(String msg)
{
this.msg = msg;
}

public String getMessage()
{
return msg;
}
}
class Demo
{
int div(int a,int b) throws FuShuException//声明可能的异常
{
if(b <0)
{
throw new FuShuException("出现了除数为负数的情况");//手动通过throw关键字抛出自定义异常对象
}

return a/b;
}
}

class ExceptionDemo1
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(4,0);
System.out.println("x="+x);
}
catch(FuShuException e)//接住
{
System.out.println(e.toString()+“除数为负数”);
}

}
}

总结:如何使用自定义异常?

1.声明一个继承exception的异常类。
2.在编程过程中,可能出现该异常的地方throw new xxException。throw的外部,需要事先声明:这部分可能会throws xxException
3.在某个地方catch住这个xxException,
-----------------------------------------------------------------------------------------------------------------
throws和throw的区别

throws在函数上使用,throw在函数内。
throws后面跟的是异常类,可以跟多个,用逗号隔开。throw后面跟的是异常对象。
throws是用来描述我们可能碰到什么样的麻烦的,throw用来把这个麻烦扔出来具体处理。
-----------------------------------------------------------------------------------------------------------------
RUNTIME EXCEPTION

exception 中有一个特殊的子类异常Runtimeexception运行时异常。如果该异常类在函数内容抛出该异常,函数上可以不用声明,编译一样通过。

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

class Demo
{
int div(int a,int b)
{

if(b == 0)
throw new ArithmeticException("被零除");
return a/b;
}
}

class ExceptionDemo4
{
public static void main(String[] args)
{
Demo d = new Demo();

int x = d.div(4,0);

System.out.println("x= "+x);
System.out.println("over");
}
}
自定义异常时,如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException
-----------------------------------------------------------------------------------------------------------------
class LanPingException extends Exception
{
LanPingException(String message)
{
super(message);
}
}

class MaoYanException extends
{

}

class Computer
{
public void run()
{
if()
throw new LanPingException;
SOP
}
}

class Teacher
{
private String name;
private Computer cmpt;

Teacher(String name)
{
this.name =   name;
cmpt = new Computer();
}
}

当电脑出现问题引发了教师停止运作之后,教师可以向外抛出自己的异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值