Java基础学习生疏知识点总结(16)——异常处理,文件和日期常用方法

1、异常

1.1 异常与错误

异常: 程序运行时期出现了问题,出现了不正常的情况,称之为异常,并导致程序终止
编译出错: 在程序的编译时期不能通过编译器的语法检查,所以报错

1.2 Throwable的子类:

① Error: StackOverflowError是常见的Error,它表示栈空间已经不够用了,溢出了

  •  递归很危险,尽量不要使用
    
  •  对于Error而言,这个错误不应该由程序员自己去抛出,而是应该让jvm抛出
    

② Exception: 描述的程序运行期间的一般问题
       RuntimeException: 这种问题无法在编译时检查和预料,只有到程序运行后才能显现问题

  •  ArithmeticException: / by zero: 数学异常 算术异常 该异常是0作为了除数
    
  •  这个异常是最容易能够直接制造的运行时异常,这个异常会经常用于测试,测试代码的抗异常性能
    
  •  测试代码的健壮性
    

       非RuntimeException: 指的是在编译时期,就需要显式的检查并处理的异常,称之为编译时异常

  • Exception子类当中,除了RuntimeException和它的子类都属于编译时异常
    
  • 比如CloneNotSupportedException就是典型的编译时异常,需要在编译时期就处理这个异常,否者编译不通过
    

1.3 Java设计异常体系的原则

  • 尽量把一切错误,摒弃在程序运行之前,最好在编译时期就发现程序潜在的问题(通过编译器)
  • 确实,Java把相当一部分异常定义为编译时异常,让程序员在编译时期就显式的处理它们
  • 但仍然有很多问题,必须要Java程序运行起来,才可能产生,被发现,是编译器检查不到的
  • 这就是运行时异常
public class Demo {
   
    public static void main(String[] args) throws CloneNotSupportedException {
   
       /* Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数: ");
        int i = sc.nextInt();
        System.out.println(10 / i);*/
        //System.out.println(0/0);

        Demo d = new Demo();
        //Unhandled exception: java.lang.CloneNotSupportedException
        d.clone();
    }
   /*
   没有递归出口的递归,会产生栈溢出错误
   public  static void test(){
        test();
    }*/
}

1.4 JVM异常处理机制

(1) java的代码产生异常,总是在一个方法当中产生异常,方法可以自己处理异常,也可以抛出异常给方法的调用者,最终异常会给到main方法程序的入口,如果main()方法还不解决,就只能抛给jvm,jvm只能自己解决。

(2)JVM是怎么解决异常的呢?
1,程序产生异常之前的代码 仍然正常执行
2,程序产生异常的代码会由jvm抛出一个异常,然后立刻从该行终止程序,后面的代码就不会执行了

  • 如果我们在程序中,不写任何和异常处理相关的代码,Java程序仍然能够对异常进行处理
    

(3) 如果错误产生在main方法中

  • 当我们的代码执行到错误行数之前,代码是正常执行的
    
  • 当我们的代码执行到错误行数时,JVM会终止程序的执行,抛出一个该异常信息封装成的对象
    

(4)将该对象中的异常信息,打印到控制台上,告诉程序员发生了什么问题
   这个异常的信息包括:

  •  异常对象的全限定类名,异常产生的原因,最重要的是发生异常的行数
    
  •  发生错误之后的语句,都不执行了
    
  • 如果错误产生在main方法当中的另一个方法中
    
  • 当程序执行到该方法的错误行数时,JVM会终止程序的执行
    
  • 向上给方法的调用者抛出一个该异常信息封装成的对象
    
  • 一直向上抛出,直到抛给main方法,main方法最终抛给JVM
    
  • 发生异常之前的语句正常执行,但是之后的语句都不执行了
    

(5) 总结:
java默认异常处理(不写任何有关异常处理的代码),会自动的往上抛出运行时异常(编译时异常由程序员手动处理决定怎么办), 直到抛给main方法,抛给jvm,然后jvm立刻终止程序执行,在控制台打印异常信息, 这种默认的异常处理会导致程序终止,往往不是我们希望的,所以我们还要手动去处理异常。

1.5 处理异常语法

  •  try...catch...finally
    
  •  try...catch...
    
  •  try...catch...catch...
    
  •  try...catch...catch...finally
    
  •  try...finally
    

1.6 自定义异常

1、怎么自定义异常?

  •  自定义编译时异常: 定义一个类,继承Exception,那么就是一个编译时异常
    
  •  自定义运行时异常: 定义一个类,继承RuntimeException,就是一个运行时异常
    

2、 怎么写自定义异常类的构造方法呢?

  •  直接去调用父类构造器就可以 super(参数)
    

3、自定义异常有啥用?

  • 在我们这个案例中,如果直接使用jdk已有的异常,比如IllegalArgumentException这个异常,看起来是可以实现效果的
  • 但是如果try当中的代码,本身也会产生这个异常IllegalArgumentException,那么就不能区分对待,不能分别处理了
  • 所以自定义异常可以区分自己写的代码的错误,不使用源码中已有的异常,避免混淆
  • 自定义异常其实比较少见,我们对异常的处理多数情况下还是以jdk中已有的为准
  • 一般公司中都有自己自定义的异常
  • 工具类
  • 异常
public class Demo {
   
    public static void main(String[] args) {
   
        try {
   
            judgeObjectNumRun(-1);
        } catch (IllegalArgumentException e) {
   
            e.printStackTrace();
            System.out.println("对象数量应该是0和1");
        }
        try {
   
            judgeObjectNum(3);
        } catch (ObjectNumException e) {
   
            e.printStackTrace();
            System.out.println("对象数量应该是0和1");
        }
    }
        //这个方法用来判断数量,如果数量不是0和1,那就有问题,有问题就要抛出异常
    public static void judgeObjectNumRun(int num) {
   
        if (num > 1) {
   
            throw new IllegalArgumentException("你是海王");
        }
        else if (num < 0 ){
   
            throw  new IllegalArgumentException("不能小于0");
        }else {
   
            System.out.println("你是个正常人!");
        }
    }

    public static void judgeObjectNum(int num) throws ObjectNumException {
   
        if (num > 1) {
   
            throw new ObjectNumException("你是海王");
        }
        else if (num < 0 ){
   
            throw  new ObjectNumException("不能小于0");
        }else {
   
            System.out.println("你是个正常人!");
        }
    }

}

class ObjectNumException extends Exception {
    //编译时异常
    public ObjectNumException() {
   
        super();
    }

    public ObjectNumException(
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值