这里总结了10个关于JAVA学习过程中同学们经常会问到的JAVA异 常问题,希望对同学们的学习有所帮助。
1、检查型异常vs非检查型异常
简单的说,检查型异常是指需要在方法中自己捕获异常处理或者声明抛出异常由调用者去捕获处理;
非检查型异常指那些不能解决的异常,如除0,空指针等;
检查型异常非常重要,因为你希望使用你API接口的人知道如何处理这些异常;
举个例子,IOException是非常常见的检查型异常,RuntimeException是非检查型异常;
Java的异常层级关系图如下:
2、异常管理最佳实践
如果一个异常当前能够被恰当的处理,那么应该捕获处理它,否则应该显示的抛出异常;
JAVA 的用途:80%以上的高端企业级应用都使用JAVA平台(电信、银行等)。JAVA是成熟的产品,已经有10年的历史。如果你想在Java行业有所建树,想要系统的进行java的学习,那么你可以来这个群,前面是二三一,中间是三一四,后面是零二八。连起来就可以了。 这里有很多互联网大牛教你学习,还有java直播的课程。不是想学习的就不要加了。
3、为什么在try代码块里定义的变量,在catch或finally代码块里不能被访问
如下代码,在try代码块中声明字符串s变量,但是不能在catch代码块中使用,代码不能编译通过;
try { File file = new File("path"); FileInputStream fis = new FileInputStream(file); String s = "inside"; } catch (FileNotFoundExceptione) { e.printStackTrace(); System.out.println(s); }
原因是因为你不知道在try代码块中的哪一句会抛出异常,很有可能这个异常在变量声明之前就抛出了;
这正是以上这个例子的情况;
注:强烈怀疑是因为作用域的关系导致s变量不可见;
4、为什么integer.parseint(null)和double.parsedouble(null)会抛出不同的异常
这是JDK的问题,因为这两个方法是不同的开发人员写的,所以没必要深究;
Integer.parseInt(null); // throws java.lang.NumberFormatException: null Double.parseDouble(null); // throws java.lang.NullPointerException
注:其实我目前的JDK7已经没有该问题了,两个都是抛出NumberFormatException
5、多用运行时异常
几个常见的运行时异常,如IllegalArgumentException、ArrayIndexOutOfBoundsException;
当判断条件不满足时,可以抛出这些异常,如下代码:
if (obj== null) { thrownew IllegalArgumentException("obj can not be null");
6、是否可以在一个catch代码块里捕获多个异常
答案是可以的。因为JAVA的异常可以追溯到同一个父类Exception,我们可以使用父类捕获多个异常;
try { } catch(Exception e) { // TODO: handle exception } 补充: 在JAVA7中,增加了新语法,可以这样捕获多个异常: try { ... } catch( IOException | SQLException ex ) { ... }
在JAVA7之前可以这样写:
try { //..... } catch (Exception exc) { if (exc instanceofIllegalArgumentException || exc instanceof SecurityException || exc instanceof IllegalAccessException|| exc instanceof NoSuchFieldException ) { someCode(); } elseif (exc instanceofRuntimeException) { throw (RuntimeException) exc; } else { thrownew RuntimeException(exc); } }
7、构造方法是否可以抛出异常
答案是可以的,构造方法是一个特殊的方法,同样可以抛出异常;
注意,如果构造方法抛出异常,对象是没有生成的;
8、finally语句块同样可以抛出和捕获异常
以下代码是合法的:
publicstaticvoid main(String[] args) { File file1 = newFile("path1"); File file2 = newFile("path2"); try { FileInputStream fis = new FileInputStream(file1); } catch(FileNotFoundException e) { e.printStackTrace(); } finally { try { FileInputStream fis = new FileInputStream(file2); } catch (FileNotFoundExceptione) { e.printStackTrace(); } } }
但是出于可读性考虑,最好把finally里的异常处理代码封装到一个方法里,然后调用该方法,如下代码:
publicstaticvoid main(String[] args) { File file1 = newFile("path1"); File file2 = newFile("path2"); try { FileInputStream fis = new FileInputStream(file1); } catch(FileNotFoundException e) { e.printStackTrace(); } finally { methodThrowException(); } }
9、finally代码块里是否可以写return语句
是的,可以
10、为什么java程序员经常悄悄地忽略异常的处理
以下代码片段会经常出现在程序中,如果异常处理那么重要,为什么还会有这么多开发人员一直这样做呢?
try { ... } catch(Exception e) { e.printStackTrace(); }
经常出现的代码并不代表是对的;
可能很多开发人员都使用eclipse的快速修复,自动生成异常处理代码,如上所示,其实除了记录下log,并没有做什么处理;
正如条目2所描述的,如果不能正确处理该异常的话,最好抛出异常,以便异常尽早被发现;
有一种处理异常的方式是try{} catch()之后,既不做任何处理,也不输出异常信息,也不往上抛异常。每次遇到这样的代码,想杀人的心都有了!特么出问题了根本就不知道错哪了..
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。