Java编程语言 09 异常

所有的异常都是继承自Throwable类,这个类不是抽象类,可以返回Java堆栈中错误的信息。
在这里插入图片描述
编程的时候,主要遇见的异常是RuntimeException。有三种RuntimeException
01.错误的类转型,就是父类转子类,父类可能引用的是其他的子类对象,却要转型成另一个子类对象,这样就会报错。还有,基础数据类型转换也会出现问题。string转换char,这个就会出现问题啊。
02.数组访问越界,比如,数组的长度只有4个,但是你要访问A[4],第五个数组元素,数组中没有,就会出现越界现象
03.访问null指针

导致程序异常的情况有很多种:
01.用户输入的异常,这种是最常见的
02.设备错误
03.物理限制
04.代码错误

良好的方法应该声明可能会出现的异常情况,关键字是throws
例如:输入流构造函数

public FileInputStream(String name) throws FileNotFoundException
{

}

这个构造器,根据参数String类型的name,会构造一个输入流对象FileInputStream,如果name指向的文件不存在,那么就会抛出一个异常FileNotFoundException对象。JVM虚拟机就会去调用异常处理器来对一个生成的异常对象进行处理。

但是不是所有时候都需要声明可能会抛出的异常情况,throws这个关键字的使用在四种情况下会发生。
01.调用一个抛出异常的方法
02.程序运行时发现错误,并且利用throw语句抛出一个异常
03.程序出现错误
04.java虚拟机运行时候出现的异常
如果没有在这四种情况中使用throw关键字的话,那么当前执行的java线程就会结束,控制台开始输出错误信息。如果要抛出的异常种类大于一种,使用逗号将他们隔开。
例如:
public Image loadImage(String s)throws FileNotFoundException , EOFException
{

}
throws抛出的异常在逻辑上是可以预测到的,是可查异常,但是Error和RuntimeException这样的异常一个是系统的异常,一个是运行时候的逻辑代码出错,这两种是预测不到的,是不可查异常。

说明一点,父类方法中没有使用到throws抛出异常,子类在继承这个方法的时候,也不可以使用throws来抛出异常。

**throws关键字还没有完成功能,还需要在函数中添加throw语句一起完成功能。**例子:
String readData(Scanner in) throws EOFException
{

while(…)
{
if(!in.hasNext())
{
if(n<len)
throw new EOFException
}
}
}

如果从文件中得到的字符串长度n小于预期的长度len,那么就会使用throw语句,抛出一个EOFException异常对象。虚拟机就会去处理这个异常对象。

抛出异常有三步:
01.先在方法体前部用throws,声明可能抛出的异常类
02.使用new语句,创建一个异常类对象。
03.使用throw语句,抛出这个异常。当前线程终止。

所有的前提是异常类,没有说是不是系统给定的,可以自己创建自己的异常类。
跟一般的类继承,创建的过程是一样的,这样就可以抛出自己定义的异常了。

如何捕获异常?
除了自己预测会出现的异常,还有RuntimeException这种不可以预测的异常,这种怎么解决异常出现的现象?

使用try catch finall 语句。去捕获RuntimeException。
格式:
try
{
code
more code
}
catch(ExceptionType e)
{
handler for this type
}

在try代码块中如果抛出来了一个在catch中说明的异常类,
01.程序将跳过try代码块中剩下的代码。
02.程序将执行catch中的代码。
注意:如果try中没有抛出来异常,不会执行catch的代码;如果try中抛出来一个异常是catch中没有声明到的类型,那么程序就会退出。

catch中声明多个异常,使用的格式是:
try
{

}
catch(FileNotFoundException)
{

}
catch(IOException e)
{

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值