java异常

异常指程序运行不正常,导致程序停止。其实就是java对不正常现象的描述。ERROR则是对一般不可处理的严重问题的处理描述。

而异常则是对不严重问题进行处理。

异常的分类:
1,编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系。 
    这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。
    这样的问题都可以针对性的处理。
2,编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。
    这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引发了内部
状态的改变导致的。
    那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停 ,让调用者对代
码进行修正。
所以自定义异常时,要么继承Exception,要么继承RuntimeException。

异常的处理,java提供了特定语句对其进行处理,语句如下:

try{}

  catch{}

  finlly{}

try里面这个是执行的代码,catch则是处理异常,finally则是有没有异常都没执行,即使前面有return也会执行。

Exception类有getMessage打印出异常信息,toString则可以打印出更多信息。

printStackTrace 则可以打印出异常名称,信息和位置。

有时候我们会看到方法名右边加了throws Exception,他的中文意思是抛出异常,有什么用呢,可以声明该方法

执行可能有问题,但方法自己不处理,将交给调用他的程序来处理。

接下来说明下多异常的处理:

异常处理的原则:
1,函数内容如果抛出需要检测的异常,那么函数上必须要声明。
  否则必须在函数内用trycatch捕捉,否则编译失败。 
2,如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。
3,什么时候catch,什么时候throws 呢?
  功能内容可以解决,用catch。
  解决不了,用throws告诉调用者,由调用者解决 。
4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。
  内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

声明一个异常,最好能声明具体的异常。比如a/0  就不会抛出异常,一般会这样声明throws Exception

但如果你这样声明 throws ArithmeticException 就会抛出更具体的异常。同时一个方法中可能有不同的异常,

所以你也可以声明多个异常。

 既然有声明多个异常,当你用trp catch 去处理,就应该有相同的catch处理块。

还有一个问题,就是我们会看到throw和throws,2者有声明区别呢?

throws使用在函数上,而throw使用在函数内

throws后面都是异常类,而throw跟的是异常对象.

你还可以自定义异常,只要继承Exception或其子类。

当你自定义异常是:如果该异常的发生,你要将程序自动停止下来,你就让自定义异常继承RuntimeException

RuntimeException是指运行时,如果有异常,则程序会自动停止。

接下来说下自定义异常:

将可能会出现的问题进行自定义描述。并封装成对象。 这种自定义的问题描述成为自定义异常。  
 注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性。 才可以被两个关键字所操作,throws throw

看下例子:

class FuShuIndexException extends Exception //自定义异常,继承Exception
{
  FuShuIndexException()
  {} 
  FuShuIndexException(String msg)
  {
    super(msg);
  }
}
 
class Demo
{
  public  int  method(int[]  arr,int  index) throws FuShuIndexException//throws NullPointerException//FuShuIndexException
  {     
    if(arr==null)
      throw new NullPointerException("数组的引用不能为空!"); 
    if(index>=arr.length)
    {
      throw new ArrayIndexOutOfBoundsException("数组的角标越界啦:"+index);
    }
    if(index<0)
    {
      throw new FuShuIndexException("角标变成负数啦!!");
    }
    return arr[index];
  }
}
 
class  ExceptionDemo3
{
  public static void main(String[] args) throws FuShuIndexException //throws FuShuIndexException
  {
    int[] arr = new int[3]; 
    Demo d = new Demo();
    int num = d.method(arr,30);
    System.out.println("num="+num);
    System.out.println("over");
  } 
}
打印的结果为:将会抛出 数组的角标越界啦:30

如果将上面int num = d.method(arr,30); 改为int num = d.method(null,30);  打印: 抛出 数组的引用不能为空!的异常

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值