✅以下关于异常处理的代码有哪些问题
public static void start() throws IOException, RuntimeException{
throw new RuntimeException("Not able to Start");
}
public static void main(String args[]) {
BufferedReader br = null;
try {
String line;
br = new BufferedReader(new FileReader("\home\usr\test.java"));
while ((line = br.readLine()) != null) {
start();
}
return;
} catch (Exception ex) {
ex.printStackTrace();
} catch (RuntimeException re) {
re.printStackTrace();
} finally {
// 是否会输出?
System.out.print("1");
}
}典型回答
#start方法不会发生IOException,所以不需要throws- RuntimeExcption不需要显式的throws
- catch的时候,要先从子类开始catch,代码中catch的顺序不对
- 没有关闭流
- return之前的finally block是会被执行的
知识扩展
上述代码,如何优化
public static void main(String... args) {
try (BufferedReader br = new BufferedReader(new FileReader("\home\usr\test.java"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// handle exception
}
}try-with-resource的原理
javac使用了语法糖进行优化
public static void main(String args[]) {
BufferedReader br;
Throwable throwable;
br = new BufferedReader(new FileReader("\home\usr\test.java"));
throwable = null;
String line;
try {
while((line = br.readLine()) != null)
System.out.println(line);
} catch(Throwable throwable2) {
throwable = throwable2;
throw throwable2;
}finally{
if(br != null)
if(throwable != null)
try {
br.close();
} catch(Throwable throwable1) {
throwable.addSuppressed(throwable1);
}
else
br.close();
}
}Java7中还对异常做了哪些优化?
- Multi-Catch Exceptions,可以连续处理多个异常,如:
public class ExampleExceptionHandlingNew
{
public static void main( String[] args )
{
try {
URL url = new URL("http://www.yoursimpledate.server/");
BufferedReader reader = new BufferedReader(
new InputStreamReader(url.openStream()));
String line = reader.readLine();
SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY");
Date date = format.parse(line);
}
catch(ParseException | IOException exception) {
// handle our problems here.
}
}
}- Rethrowing Exceptions
- Suppressed Exceptions
- 参考网址
Java中异常的处理方式有哪几种?一般如何选择。
异常的处理方式有两种。1、自己处理。2、向上抛,交给调用者处理。
异常,千万不能捕获了之后什么也不做。或者只是使用e.printStacktrace。
具体的处理方式的选择其实原则比较简明:自己明确的知道如何处理的,就要处理掉。不知道如何处理的,就交给调用者处理