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("/tempFile"));
while ((line=br.readLine())!=null){
start();
}
return;
}catch (Exception ex){
ex.printStackTrace();
}catch (RuntimeException re){
re.printStackTrace();
}finally {
//是否会输出?
System.out.println("1");
}
}
面试回答
#start
方法不会发生IOException
,所以不需要throw
RuntimeException
不需要显示的throw
catch
的时候,要先从子类开始catch
,代码中catch
的顺序不对- 没有关闭流
- return 之前的 finally block 是会被执行的
知识扩展
上诉代码,如何优化
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("tempFile"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
// handle Exception
}
}
try-with-resource 的原理
javac 使用了语法糖进行优化
public static void main(String args[])
{
BufferedReader br;
Throwable throwable;
br = new BufferedReader(new FileReader("tempFile"));
throwable = null;
String line;
try
{
while((line = br.readLine()) != null)
System.out.println(line);
}
catch(Throwable throwable2)
{
throwable = throwable2;
throw throwable2;
}
if(br != null)
if(throwable != null)
try
{
br.close();
}
catch(Throwable throwable1)
{
throwable.addSuppressed(throwable1);
}
else
br.close();
break MISSING_BLOCK_LABEL_113;
Exception exception1;
exception1;
if(br != null)
if(throwable != null)
try
{
br.close();
}
catch(Throwable throwable3)
{
throwable.addSuppressed(throwable3);
}
else
br.close();
throw exception1;
Exception exception;
exception;
}
Java 中异常的处理方式有哪几种?一般如何选择
异常的处理方式有两种:
- 自己处理。
- 向上抛,交给调用者处理。
异常,千万不能捕获了之后什么也不做。或者只是使用 e.printStackTrace();
。
具体的处理方式的选择原则其实比较简明:
- 自己明确的知道如何处理的,就要处理掉。
- 不知道如何处理的,就交给调用者处理。