java基础之异常

目录

一:Java中的异常:Throwable

二:异常分类

三:JVM的默认处理方案

四:异常处理方案

1: try...catch...finally

2:throws

3:throw

4:注意事项

五: try...catch...finally处理多级异常

1)每个异常都写一个try...catch

2)写一个try,多个catch

3)JDK7的新特性及注意事项

4)注意事项:

六:throws和throw的区别

throws: 用在方法声明的后面,跟的是异常的类名。

throw:用在方法体内,跟着的是异常的对象。

七:Throwable中的方法

getMessage()

toString()

printStackTrace()

八: final,finally和finalize的区别


一:Java中的异常:Throwable

严重的问题:Error,一般情况下,我们不处理,这样的问题一般都是很严重,

比如OOM,内存溢出问题。

问题:异常:Exception

运行时异常:RuntimeException(运行时异常),这样的问题我们也不处理,因为这种问题一般都是你自己写代码出现的问题比如代码不够严谨

例如:int a =12;

int b =0;

System.out.println(a/b);

在写程序时不会报错但是运行时会出现错误java.lang.ArithmeticException: / by zero

编译时异常:除了不是RuntimeException都是编译时异常,必须要进行处理,如果你不处理,

程序编译就不通过,无法运行。如图:

二:异常分类

三:JVM的默认处理方案

把异常的名称,错误原因及异常出现的位置等信息输出在了控制台 程序停止执行。

四:异常处理方案

1: try...catch...finally

try{

可能会出现问题的代码;

}catch(异常的类名 变量名){

针对问题的一些处理;

}finally{

释放资源的代码;

}

变形格式:

try{

可能会出现问题的代码;

}catch(异常的类名 变量名){

针对问题的一些处理;

}

package day30;

public class Test2
{ public static void main(String[] args) {

    int a =0;
    int b =1;
    try{
        System.out.println(b/a);
    }catch (ArithmeticException e){
        System.out.println("出现错误了");
    }

    }}

结果:

出现错误了

Process finished with exit code 0
 

2:throws

定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。 

3:throw

在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。 

4:注意事项

1、try里面的代码尽量不要太多

2、catch里面必须要有内容,哪怕只是有一句简单提示语句

五: try...catch...finally处理多级异常

1)每个异常都写一个try...catch

2)写一个try,多个catch

try{

可能会出现问题的代码;

}catch(异常的类名 变量名){

针对问题的处理;

}catch(异常的类名 变量名){

针对问题的处理;

}...

public class Test2
{ public static void main(String[] args) {

  int[] a={1,2,3,4,5,6,7,8,9};
  int x=0;
  int y=12;
  try{
      System.out.println(a[10]);
      System.out.println(y/x);
  }catch (ArithmeticException  e){
      System.out.println("除数不能为0");
  }
  catch (ArrayIndexOutOfBoundsException e1){
      System.out.println("数组下标越界");
  }


    }
}

数组下标越界

Process finished with exit code 0
//由于出现错误以后后面的就不输出所以只输出了第一个catch中的语句。

3)JDK7的新特性及注意事项

新特性处理多个异常

try{

可能会出现问题的代码;

}catch(异常类名1|异常类名2|... 变量名){

处理异常的提示;

}

package day30;

public class Test2
{ public static void main(String[] args) {

    int[] a={1,2,3,4,5,6,7,8,9};
    int x=0;
    int y=12;
    try{
        System.out.println(a[10]);
        System.out.println(y/x);
    }catch (ArithmeticException| ArrayIndexOutOfBoundsException  e){
        System.out.println("出错了");
    }




    }
}

出错了

Process finished with exit code 0
 

注意:

1、处理方式是一致的,这个方法虽然比较简洁,但是不够好,针对多种类型的问题,只给出了一种解决方案。

2、多个异常的类型之间必须是平级关系

4)注意事项:

1、能明确异常的类型的时候尽量明确,不要用父类大的作处理

2、平级的关系,多个catch异常没有前后顺序关系,谁在前谁在后无所谓,一旦出现了父类继承的关系,父必须在后。

3、一旦try里面的代码出现了问题,就会去匹配catch里面的异常,继续执行程序后面的代码,

但是try里面的代码就停在了出现问题的那一步。

六:throws和throw的区别

throws: 用在方法声明的后面,跟的是异常的类名。

可以跟多个异常类名,用逗号隔开

表示的是抛出异常,由该方法的调用者处理

throws表示的是出现异常的一种可能性,为了程序的正常运行,我们选择抛出给调用者处理

不一定会发生这种异常

throw:用在方法体内,跟着的是异常的对象。

只能抛出一个异常对象。

表示的时候抛出异常,由方法体内的语句做处理。

throw表示的是一定出现了某种异常。

七:Throwable中的方法

getMessage()

获取异常信息,返回字符串。

toString()

获取异常类名和异常信息,返回字符串。

返回此可抛出的简短描述。 结果是:

这个对象的类的name

+“:”(一个冒号和一个空格)

+ 调用这个对象的getLocalizedMessage()方法的结果

对于不重写此方法的子类,默认实现返回相同的结果为getMessage() 。

package day30;

public class Test2
{ public static void main(String[] args) {

  int x=0;
  int y=12;
  try{
      System.out.println(y/x);
  }catch (ArithmeticException  e){
      //获得异常信息和异常类名输出
      String message = e.getMessage();
      String s = e.toString();
      System.out.println(message+s);
  }



    }
}

/ by zerojava.lang.ArithmeticException: / by zero

Process finished with exit code 0
 

printStackTrace()

获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

package day30;

public class Test2
{ public static void main(String[] args) {

  int x=0;
  int y=12;
  try{
      System.out.println(y/x);
  }catch (ArithmeticException  e){
      //调用printStackTrace输出异常信息
     e.printStackTrace();
  }



    }
}

java.lang.ArithmeticException: / by zero
    at day30.Test2.main(Test2.java:9)

Process finished with exit code 0
 

八: final,finally和finalize的区别

final:最终的意思,可以修饰类,成员变量,成员方法

修饰类:类不能被继承

修饰成员变量:变量就是常量

修饰成员方法:方法不能被重写

finally:是处理异常的一部分,一般情况下用于释放资源的作用,一般来说都会执行

特殊情况下:在执行finally之前JVM就停了(System.exit(0))

finalize:是Object类中的一个方法,用于手动垃圾回收,但是不一定会立即回收

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值