异常
1整体框架
Throwable类是 Java 语言中所有错误或异常的超类,下面有Error和Exception两个子类
1) Error为严重问题,一般,比如说内存溢出(应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存)。
2) 问题:ExceptionException 类及其子类是Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件,另外还有以下两种情况的处理:
a、编译期问题:不是RuntimeException的异常 必须进行处理的,如果不处理,编译就不能通过。
b、运行期问题:RuntimeException 可以不处理但是会抛出运行异常
2 throws和throw的区别
所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。常用的有throws和throw这两种情况
2.1throws的使用方法
- 用在方法声明后面,跟的是异常类名
- 可以跟多个异常类名,用逗号隔开
- 表示抛出异常,由该方法的调用者来处理
- throws表示出现异常的一种可能性,并不一定会发生这些异常
编译期异常抛出,将来调用者必须处理。而在运行期异常抛出,将来调用可以不用处理。但是为了良好的用户体验还是必须要处理的,否则程序在出现异常时无法运行。
2.2throw的使用方法
- 用在方法体内,跟的是异常对象名
- 只能抛出一个异常对象名
- 表示抛出异常,由方法体内的语句处理
-throw则是抛出了异常,执行throw则一定抛出了某种异常
3try…catch…finally的使用说明
3.1 finally的用法
finally:被finally控制的语句体一定会执行(除非在执行到finally之前jvm退出了,如System.exit(0)在finally之前执行)
格式为 try…catch…finally..一般用于释放资源,在IO流操作和数据库操作中会见到。
try…catch…finally的格式变形一般为一下几种情况
- try…catch…finally
- try…catch
- try…catch…catch…
- try…catch…catch…finally
- try…catch…catch…finally
- try…finally
3.2 try…catch的说明
- try 中可能出现问题的代码,且里面的代码越少越好
- 能明确的尽量明确,不要用大的来处理
- 在catch 中平级关系的异常可以与顺序无关,如果出现了子父关系,父必须在后面
4常用的异常方法
- public String getMessage():异常的消息字符串
- public String toString():返回异常的简单信息描述
- 此对象的类的 name(全路径名) “: “(冒号和一个空格)
- 调用此对象 getLocalizedMessage()方法的结果 (默认返回的是getMessage()的内容)
- printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。把信息输出在控制台。
5final,finally和finalize的区别
final可以修饰类,成员变量,成员方法
- 修饰方法,方法不能被重写
- 修饰类,类不能被继承
- 修饰变量,变量是常量
finally:是异常处理的一部分,用于释放资源。
- 一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了
- 如果catch里面有return语句,finally里面的代码会在return之前执行
- finalize:是Object类的一个方法,用于垃圾回收
6自己定义异常
- 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
- 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
测试例程
MyException
public class MyException extends Exception {
public MyException() {
}
public MyException(String message) {
super(message);
}
}
public class LookAfter {
public void check(Integer i) throws MyException
{
if (i>=0&&i<=100)
{
System.out.println("当前学生的成绩为"+i);
}
else
{
throw new MyException("应该输入0--100之间的数字");
}
}
}
package lsx.ExceptionDemo;
import java.util.Scanner;
public class ExceptionDemo {
public static void main(String[] args)
{
Scanner sc =new Scanner(System.in);
System.out.println("请输入成绩:");
int i =sc.nextInt();
LookAfter la =new LookAfter();
try{
la.check(i);
}
catch (MyException me)
{
me.printStackTrace();
}
finally {
System.out.println("加油");
}
}
}