今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException.
函数Integer.parseInt(String)定义
1 public static intparseInt(String s)2 throws NumberFormatException
测试代码:
1 public classTest2 {3 public static voidmain(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 classTest2 {3 public static voidmain(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 classTest2 {3 public static voidmain(String[] args)4 {5 doSomething();6 }7
8 public static void doSomething()throwsException9 {10 Integer num = Integer.parseInt("ff");11 System.out.println(num);12 }13 }
上面的代码无法通过编译,因为在doSomthing()里面抛出了异常,需要在Main函数中处理。Main函数要么加上try catch 语句,要么将此异常继续向上抛出,交给JVM处理。但一般不这么做。我们总希望程序能正确的运行并退出。下面是正确的处理异常代码:
1 public classTest2 {3 public static voidmain(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()throwsException18 {19 Integer num = Integer.parseInt("ff");20 System.out.println(num);21 }22 }