• Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch


    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException.

    函数Integer.parseInt(String)定义

    1 public static int parseInt(String s)
    2                     throws NumberFormatException

    测试代码:

    1 public class Test
    2 {
    3     public static void main(String[] args)
    4     {
    5         Integer num = Integer.parseInt("ff");
    6         System.out.println(num);
    7     }
    8 }

    我们知道,所有的会抛出异常的地方都需要try catch 捕获,或者使用throws继续向上抛出。那么为什么上面的代码会通过编译呢?原来Java里面有Exception和RuntimeException这两个类。RuntimeException是Excetpion的子类。如果一个某一个异常是RuntimeException的子类而不是Exception的直接子类,那么我们可以不用显示的try catch捕获,而是在发生异常的时候抛给JVM捕获。当然我们也可以写上try catch来处理,不交给JVM。如下面的代码:

     1 public class Test
     2 {
     3     public static void main(String[] args)
     4     {
     5         try
     6         {
     7             Integer num = Integer.parseInt("ff");
     8             System.out.println(num);
     9         }catch(Exception e)
    10         {
    11             System.out.println("程序出现了异常!");
    12         }
    13     }
    14 }

    关于Java中的异常,还有一些常见问题,现在罗列在下面:

    1) Exception类关系

    Throwable是所有异常的父类。如常见的:NullPointerException和ClassNotFoundException

    2)Error和Exception

    Throwable下有两个子类,一个是Exception,另一个是Error。那么Error和Exception有什么区别呢?

    Error:是指JVM错误。这个是我们自己写程序中不会遇到的,是JVM运行过程中自己抛出的异常。这个不需要程序员过多的关注。

    Exception:所有用户可以处理的异常的父类。也就是说,我们写代码的过程中可能会遇到的所有的异常的父类就是Exception

    3)Exception和RuntimeException

    这就是本文一开始讨论的话题。Exception是RuntimeException的父类。程序员在写代码的时候,如果遇到抛出的是RuntimeException,则可以根据情况选择是否用try catch或者throws 对异常进行处理。如果遇到的异常是Exception子类,但又不是RuntimeException子类,那么程序中必须显示的try catch或者throws 进行处理。

    4)throw与throws的区别

    throw指的是我们程序遇到异常的时候,在当前上下文中不处理。说得更狭隘一点,比如我们在一个函数中,如果有异常,我们直接用throws抛出,交给函数调用处进行处理,而不在本函数中处理。

    throws指的是如果函数中有用throw抛出异常,需要在函数声明的末尾加上throws语句,表明当前函数会抛出异常,从而通知函数的调用出进行显式处理。throws和throw是配合使用的。如下面的代码:

     1 public class Test
     2 {
     3     public static void main(String[] args)
     4     {
     5         doSomething();
     6     }
     7     
     8     public static void doSomething()throws Exception
     9     { 
    10         Integer num = Integer.parseInt("ff");
    11         System.out.println(num); 
    12     }
    13 }

    上面的代码无法通过编译,因为在doSomthing()里面抛出了异常,需要在Main函数中处理。Main函数要么加上try catch 语句,要么将此异常继续向上抛出,交给JVM处理。但一般不这么做。我们总希望程序能正确的运行并退出。下面是正确的处理异常代码:

     1 public class Test
     2 {
     3     public static void main(String[] args)
     4     {
     5         try
     6         {
     7             doSomething();
     8         }
     9         catch(Exception e)
    10         {
    11             System.out.println("doSomething函数出现了异常!异常信息如下:");
    12             e.printStackTrace();
    13         }
    14         System.out.println("Main函数正常退出!");
    15     }
    16     
    17     public static void doSomething()throws Exception
    18     { 
    19         Integer num = Integer.parseInt("ff");
    20         System.out.println(num); 
    21     }
    22 }
  • 相关阅读:
    js基础 ---- 为什么定时器时间不准确
    vue 3.0 ---- reactive函数
    vue 3.0 ---- ref函数
    vue 3.0 ---- setup函数
    vue 3.0 ---- 什么是vite
    Vue warn]: Error in event handler for "click": "TypeError: fns.apply is not a function"
    vueJs 自动清除文本框的 空格
    vue 报错解决 -------- DOMException: Failed to execute 'insertBefore' on 'Node' --------------------"NotFoundError: Failed to execute 'insertBefore' on 'Node': The node before
    vue 中 uuid 的使用以及作用
    赞不绝口钉钉自动点赞器
  • 原文地址:https://www.cnblogs.com/kuillldan/p/6106113.html
Copyright © 2020-2023  润新知