java基础之异常类
1、异常类定义
异常:在java语言中,将程序执行中发生的不正常的情况称为异常。(开发过程中的语法错误和逻辑错误不是异常)。
Java程序在执行过程中所发生的异常事件可分为两类:
(1)Error:java虚拟机无法解决的问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。//error实例
public class TestError {
public static void main(String[] args) {
main(args);
}
}
执行后出现:
Exceptionin thread "main" java.lang.StackOverflowError
。
(2)Exception:其他因编程错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针异常、视图访问不存在的文件、网络连接中断。
运行时异常:/**
* java.lang.Throwable
* |--Error:错误,程序中不进行处理
* |--Exception: 异常,要求在编写程序时,就要考虑到对这些异常的处理。
* |---编译时异常:在编译期间出现的异常
* |---运行时异常:在运行期间出现的异常
*/
public class TestError {
//编译时异常
@Test
public void test5(){
FileInputStream fis = new FileInputStream(new File("hello.txt"));
int b;
while((b = fis.read()) != -1){
System.out.println((char)b);
}
fis.close();
}
//常见的运行时异常
//1、数组下标越界异常:ArrayIndexOutOfBoundsException
@Test
public void test(){
int [] temps = new int[10];
System.out.println(temps[10]);
}
//2、算数异常:ArithmeticException
@Test
public void test2(){
System.out.println(8/0);
}
//3、类型转换异常:ClassCastException
@Test
public void test3(){
Object object = new Date();
String str = (String) object;
}
//4、空指针异常:NullPointerException
@Test
public void test4(){
Person p = new Person();
p = null;
System.out.println(p.toString());
String str = new String("AA");
System.out.println(str.length());
}
}
class Person{
}
2、异常类的处理方式
/**
* 处理异常(指的是Exception):采用抓抛模型
* 1、“抛”:当我们执行代码时,一旦出现异常就会在异常的代码处生成一个对应的异常类型对象,并将此对象抛出。(自动抛出 、 手动抛出throws)
* 》一旦抛出此异常类的对象,那么程序就终止执行。
* 》此异常类的对象抛给方法的调用者。
在方法的声明处,显式的抛出该异常对象的类型
* 例如:public static void method2() throws FileNotFoundException,IOException{}
* 当在此方法内部出现异常时,会抛出一个异常类的对象,抛给方法的调用者。
* 异常的对象可以逐层向上抛,直至main方法中,可以再通过try。。catch方法进处理。
*/
* 2、“抓”:抓住上一步抛出来的异常类的对象。
* java提供了两种方式来处理异常类的对象:
* 处理方式一:
* try{
* 可能出现异常的代码
* }catch(Exception e1){
* 处理的方式1
* }catch(Exception e2){
* 处理的方式2
* }finally{
* 一定要执行的代码(但是此模块可选)
* }
* 注:1)、try内声明的变量,类似于局部变量,出了try语句,就不能被调用。
* 2)、finally模块式可选的。
* 3)、catch语句内部是对异常对象的处理。
* getmessage()、printStackTrace()。
* 4)、可以有多个catch语句,try中出现的异常类对象从上往下匹配catch中的异常类类型,一旦满足就执行catch中的代码,
* 执行完就退出其后的多条catch语句。
* 5)、如果异常处理了,那么其后的代码继续执行。(类似于放羊(程序执行)时,狼(异常)来了,我们打死了狼,还可以继续放羊。)
* 6)、若catch中多个异常是并列关系,谁上谁下没有关系;但是如果多个catch中的多个异常关系是“包含关系”,
* 须将子类放在父类的上边,否则会报错。
* 7)、finally中存放的是一定会被执行的代码,不管catch中是否仍有异常未被处理以及是否有return语句。
* 8)、try 、 catch内部可以继续嵌套try 、 catch语句。
*3、对于运行时异常,可以不用处理,但是编译时异常必须进行显式处理。
* java的异常处理:抓抛模型
* 1、抓:异常的处理,有两种方式(① try。。catch模型 ② throws+异常的类型)
* 2、抛:一旦执行过程中出现异常,会抛出一个异常类对象。(自动抛出、手动抛出(throw + 异常类对象))
》手动抛出的异常既可以是现成的异常类对象,也可以自己创建的异常类对象。
3、自定义异常类
//如何自定义一个异常类
//1、让自定义的异常类继承现有的异常类。
//2、提供一个序列号,提供几个重载的构造器即可。
//3、子类重写的父类的方法,其抛出的异常类型智能是被重写的方法的异常类的子类或者与一样。
//比如B类是A类的子类,重写的方法是method。当实现多态时,A a = new B(); a.method();此时如果子类B中的异常范围比A类的大,
//那么使用try catch或者throws进行处理时,是不能处理这种异常的。
public class MyException extends RuntimeException{
private static final long serialVersionUID = 1L;
public MyException(){
super();
}
public MyException(String msg){
super(msg);
}
}
4、练习题
public class EcmDef {
public static void main(String[] args) {
try{
int i = Integer.parseInt(args[0]);//被除数
int j = Integer.parseInt(args[1]);//除数
ecm(i, j);
}catch(NumberFormatException e){
System.out.println("输入的数据类型不一致");
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("缺少命名行参数");
}catch(ArithmeticException e){
System.out.println("分母是0");
}catch(EcDef e){
System.out.println(e.getMessage());
}
}
public static void ecm(int i , int j) throws EcDef{
if(i<0 || j<0){
throw new EcDef("您输入的数值存在负数");
}
System.out.println(i/j);
}
}
class EcDef extends Exception{
private static final long serialVersionUID = 1L;
public EcDef(){
super();
}
public EcDef(String msg){
super(msg);
}
}