Exception一

Exception

Exception与Error的区别

Throwable类是Java语言中所有错误和异常的Throwable类。
Exeption:编译期异常,进行编译(写代码)java程序出现的问题
runtimeexception:运行期间异常,java此程序运行期间的问题error:
错误必须修改代码,才能继续运行

异常是怎么产生的,如何处理异常

jvm接收到这个异常对象,做了两件事
1.把异常对象(内容,原因,位置)以红色的字体打印在控制台
2.jvm会终止当前正在执行的java程序–>中断处理
在这里插入图片描述
图片来源于网络!!!

两种方式处理异常

1.throws ParseException

throws关键字:异常处理的第一种方式,交给别人处理
作用:

  • 当方法内部抛出异常处理对象的时候,那么我们就必须处理这个异常

  • 可以使用throws关键字处理异常对象,会把这个异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给jvm处理–>中断处理
    使用格式:在方法声明时使用

  • 修饰符 返回值类型 方法名(参数列表) throws AAAException,BBBException…{

  • throw new AAAException(“产生原因”

  • throw new BBBException(“产生原因”);
    *… }
    注意:

  • 1.throws关键字必须在方法声明出

  • 2.throws关键字后边的声明的异常必须是Exception后者是其子类

  • 3.方法内部如果抛出多个异常对象,那么throws后边必须也声明多个异常

  • 如果抛出的多个异常对象有子父关系,那么直接声明父类异常即可

  • 4.调用了一个声明抛出异常的方法,我们就必须的处理声明的异常

  • 要么继续使用throws声明怕抛出要么交给方法的调用者处理,最终交给JVM

  • 要么trycatch自己处理异常
    举例代码

      public class Demo05Throws {
      public static void main(String[] args) throws IOException {
      readFile("c:\\a.tx");
      }
      /*//对传递的文件路径进行合法判断
       如果路径不是"C:\\a.txt",那么我们就抛出文件找不到异常,告知方法的调用者*/
      //FileNotFoundException是编译异常!可以使用throws继续声明抛出FileNotFoundException这个异常对象,让方法的调用者处理
      public  static void readFile(String fileName) throws IOException {
     if(!fileName.equals("c:\\a.txt"))
     {
         throw new FileNotFoundException("传递的文件路径不是C:\\a.txt");
     }
     if(!fileName.endsWith(".txt"))
     {
         throw new IOException("文件名的后缀名txt");
     }
    
     System.out.println("路径没有问题,读取文件");
      }
      }
    

    1.2throw关键字讲解(处理运行时的异常)

    throw关键字

  • 作用:可以使用throw关键字在指定的方法中抛出指定异常

  • 使用格式:

  • throw new ****Exception(“异常产生的原因”)

  • throw关键字抛出指定的异常对象,我们就必须 处理这个异常对象

  • throw关键字后边创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认就交给JVM处理(打印异常对象,中断程序)

  • throw关键字后边创建的是编译异常(写代码时候报错),我们就必须处理这个异常,要么Throws,要么Try{}catch(){}
    举例代码

      public class Demo03Throw {
      public static void main(String[] args) {
      //int arr[]=null;
      int arr[]=new int[3];
      getElement(arr,3);
    
      }
      public static int getElement(int arr[],int index)
      {
      	if(arr == null)throw new NullPointerException("空指针异常");//NullPointerException是一个运行期异常,我们不用处理,默认交给JVM
      //对传递过来的数进行合法化校验!
      if (index<0||index>arr.length-1)throw new ArrayIndexOutOfBoundsException("数组越界异常,传递的索引超出了数组的使用范围!");
    
      return arr[index];//1发现数组越界,此方法没有异常处理逻辑,返回到Main中
       }
      }
    

当传递至为空这一特殊情况时,我们可以使用Object类下面的requireNonNull方法:
static T requireNonNull(T obj, String message)
检查指定的对象引用不是null并抛出自定义的NullPointerException(如果是)。
代码:

public class Demo04Objectrequiire {
public static void main(String[] args) {
   method(null);
}
public static void method(Object obj)
{
    //if(obj==null)throw new NullPointerException("传递的对象是空!");
    Objects.requireNonNull(obj,"传递的对象是空!");

}
}

2.trycatch

try{可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出异常对象)
{异常处理逻辑,异常处理对象之后,怎么处理异常对象
一般在工作中,会把异常的信息记录到一个日志中
}…
catch(异常类名 变量名)
{}
注意:
1.try中可能会抛出多个异常,那么就可以用多个catch来处理这些异常对象
2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try…catch之后的代码
如果try中没有异常那么就不会执行catch中异常处理逻辑,执行完try中的代码,继续执行try…catch之后的代码
举例代码:

public class Demo06TryCatch {
public static void main(String[] args) {
    try {
        readFile("c:\\a.tx");//有可能有问题的代码
        System.out.println("资源释放");//执行不到!此语句
    }
    catch (IOException e)
    {
       
       //System.out.println("catch-传递的文件名后缀不是.txt");
       // System.out.println(e.toString());//重写Object类中的tostring类方法 java.io.IOException: 文件名的后缀名txt
       // System.out.println(e);//重写Object类中的tostring类方法 java.io.IOException: 文件名的后缀名txt
        System.out.println(e.getMessage());//文件名的后缀名txt
        e.printStackTrace();/*java.io.IOException: 文件名的后缀名txt
at cn.itcast.API.Exception.Demo06TryCatch.readFile(Demo06TryCatch.java:38)
at cn.itcast.API.Exception.Demo06TryCatch.main(Demo06TryCatch.java:19)*/
    }
    System.out.println("使用trycatch方法,执行完之后继续执行代码!");
}
/*//对传递的文件路径进行合法判断
如果路径不是"C:\\a.txt",那么我们就抛出文件找不到异常,告知方法的调用者*/
//FileNotFoundException是编译异常!可以使用throws继续声明抛出FileNotFoundException这个异常对象,让方法的调用者处理
public  static void readFile(String fileName) throws IOException{

    if(!fileName.endsWith(".txt")) {
            throw new IOException("文件名的后缀名txt");
    }

    System.out.println("路径正确!");
}
}

关于catch中的三种方法:
/*throwable中的三个方法
* 1.void printStackTrace(PrintWriter s)
将此throwable和其追溯打印到指定的打印作者打印信息是最全面的
* 2.String getMessage()
返回此可抛出的简短描述。
* 3.String toString()
返回此throwable的详细消息字符串。 */

2.2try catch finally

try catch上面已经介绍过了
fianlly
{}//无论出现异常都会执行
注意:
1.try中可能会抛出多个异常,那么就可以用多个catch来处理这些异常对象
2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try…catch之后的代码
如果try中没有异常那么就不会执行catch中异常处理逻辑,执行完try中的代码,继续执行try…catch之后的代码
3finally不能单独使用,必须和try一起使用
finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要释放资源(IO)
如果finally中有return语句,永远返回finally中的结果,避免该情况!
代码举例:

public class Demo07TryCatchFinally {
public static void main(String[] args) {
    try {
        readFile("c:\\a.tx");//有可能有问题的代码
        System.out.println("资源释放");//执行不到!此语句f
    }
    catch (IOException e)
    {//异常处理的逻辑
        e.printStackTrace();
    }finally {
        //无论是否出现异常,都会执行
        System.out.println("资源释放");//执行不到!此语句
    }
    System.out.println(getelement());

}

public  static void readFile(String fileName) throws IOException{

    if(!fileName.endsWith(".txt")) {
            throw new IOException("文件名的后缀名txt");
    }

    System.out.println("路径正确!");
}
public  static  int getelement()
{
    int a=10;
    try {
        return a;
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally {
         a=100;
        return a;//避免出现该情况!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值