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 }
原文地址:https://www.cnblogs.com/kuillldan/p/6106113.html