今天在做一个将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 }