java异常处理

JAVA异常

java异常概念

尽管程序员代码尽善尽美,在系统运行时仍会出现问题,很多问题不是代码能够解决的,如读取文件是否存在,网络是否通畅等

异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。

异常分类

• Error : Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。
• Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理 例如:

访问数组下标越界
试图读取不存在的文件
网络连接中断

异常的处理方法

1程序发生异常停止运行

2程序员在编译期间对异常进行捕获处理等,但是有些异常是在程序运行阶段才报错
在这里插入图片描述

异常分为编译时异常和运行时异常

常见的运行时异常(RuntimeException)有:除数为0(数学异常),数组访问越界,空指针异常等

编译时异常(CheckedException) : 如(IOException) IO异常, (SQLException)数据库异常

异常体系

在这里插入图片描述

异常处理

异常处理机制为程序提供了错误处理能力

异常处理5个关键字:try ,catch,finally,throw,throws

在这里插入图片描述
对两种处理方法的理解
throw手动抛出异常相当于你犯了错,假如你对公司造成了几百万的损失,throws声明相当于你可以向组长反映,甩锅给组长,组长又甩锅给经理,经理甩锅给ceo,ceo说公司没这么多钱,公司倒闭,相当于程序崩了。

try catch相当于你反映给领导,领导说自己钱够先垫着,问题解决了,不会继续上抛。

一般main方法中选择try–catch 相当于ceo说集资,问题肯定能解决,不然公司就倒闭了

组合起来处理异常有

     try {代码块} //其中try代码块为可能出现异常的代码
     catch{代码块}//catch进行对异常的捕捉,打印异常信息等操作
     
      try{代码块}//同上
     catch{代码块}//同上
    finally{代码块}//同上
    
    try{代码块}
    finally{代码块}
    //finally代码块无论程序有误异常一定会被执行

假如try或者catch中有返回值,finally语句在它前面会执行
finally代码块一般会放程序必须执行的,如io流使用完的关闭

try—catch—finally
一个try可对应多个catch,需要注意的是catch的异常类型
只能有小到大,如下IOException只能声明在Exception前

//try--catch--finally结构
private static int test2(int a,int b) {
        try {
             int c = a/b;
             return c;
        }catch (IOException e){
             return -1;
        }
        catch(Exception)
         finally {
            System.out.println("finally 代码块");//IO  数据库
        }
    }

throw和throws
调用者需要声明被调用的异常,否则编译报错,

    public static void main(String[] args) {
        try {
            doSome1();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }//main方法处理异常一般选择try-catch捕捉,
    //因为出现异常传入JVM,程序会终止
    public static void doSome1()throws Exception{
        doSome2();//若不声明异常此处编译报错
    }
    public static void doSome2()throws Exception{
    }
}

获取异常信息,用在catch{}代码块中

   //方法一 
   e.printStackTrace();
  //方法二   
   System.out.print(e.getmassage)

throw和throws

throw为声明异常,而throws为抛出异常对象

  public void doSome()throws IOException,异常2,异常3
   { //throws可声明多个异常 } 

  throws new Exception"错误原因")
  //抛出一个异常对象

存在继承关系 子类声明异常范围需要小于父类

   class A throws异常1{
   }
   class B extends A throws 异常2{}
   //存在继承关系 子类声明异常范围需要小于父类
   //也就是说异常2与异常1相同或者是其子类

自定义异常

public class myException extends Exception{
          myException(){};//无惨构造
          myException(String s){
              super(s);}//有参构造继承Ecxeption
              //自定义方法往往只需要重载构造方法
          }

举例:定义一个判断是否构成三角形的异常,若不满足三角形边长条件,抛出异常

package yichang;

public class SJX {
    double a,b,c;

    public SJX(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
    public boolean IfSjx() throws SJXException {
        if((a+b)>c&&(a+c)>b&&(b+c)>a){
            System.out.println("OK");
        }
        else{
            throw new SJXException("No");
        }
        return false;
    }
}
public class SJXException extends Exception{
          SJXException(){};
          SJXException(String s){
              super(s);
          }
}
public class SJXtext {

    public static void main(String[] args) {
       SJX sjx =new SJX(1,1,100);
        try {
            sjx.IfSjx();
        } catch (SJXException e) {
            e.printStackTrace();//打印异常信息
         //也可以使用System.out.print(e.getmassage)
            System.out.println(e.getMessage());
        }
    }
}

总结:
出现编译时异常,程序编译时需对其处理,当然运行时异常无需处理
如何选择try–catch(–finally)或者throw?
取决于我们的目的,如果为了给用户提出相关错误信息,选择throw向上一级抛出,同时结合自定义异常,满足用户需求
只是为了处理的话选择try–catch即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值