try-catch-finally
try{
代码可能有异常
}catch(Exception e ){
捕获异常
当异常发生时
系统将异常封装成Exception对象e,传递给 catch
得到异常对象后,程序员自己处理
注意,如果没有发生异常,catch代码块不执行
}finally{
不管try代码块是否有异常发生,始终要执行finally
所以,通常将释放资源的代码放在finally
可写可不写
}
throws
throws给顶级的JVM后
JVM直接输出异常信息
直接退出程序
如果你没有显示的使用两个异常中的一个,它会默认的使用throws
try-catch-finally内容
1.如果异常发生了,则异常发生后面的代码就不会执行,直接进入catch
2.如果异常没有发生,则顺序执行try代码块的内容,不会进入catch
3.如果希望不管是否发生异常,都执行某段代码,(比如关闭连接,释放资源等等)则使用 finally
package com.ylxstudy.exception_.try_;
/**
* @author
* @version 1.0
*/
public class TryCatchDetail {
public static void main(String[] args) {
/*
* 1.如果异常发生了,则异常发生后面的代码就不会执行,直接进入catch
* 2.如果异常没有发生,则顺序执行try代码块的内容,不会进入catch
* 3.如果希望不管是否发生异常,都执行某段代码,(比如关闭连接,释放资源等等)则使用 finally
* 4.
* */
try {
String name= "小黄";
int a = Integer.parseInt(name);
System.out.println("数字为" + a);
} catch (NumberFormatException e) {
System.out.println("异常信息=" + e.getMessage());
}finally {
System.out.println("finally被执行");
}
System.out.println("程序继续...");
}
}
内容:
1.如果try代码块有可能有多个异常,第一个异常发现之后,第二个异常就不会在执行使用多个catch分别捕获不同的异常,相应处理
2.要求,子类异常写在前面,父类异常写在后面
package com.ylxstudy.exception_.try_;
/**
* @author
* @version 1.0
* 多个catch 分别捕获不同的异常
*/
public class TryCatchDetail02 {
public static void main(String[] args) {
/*
* 1.如果try代码块有可能有多个异常,第一个异常发现之后,第二个异常就不会在执行
* 使用多个catch 分别捕获不同的异常,相应处理
* 2.要求,子类异常写在前面,父类异常写在后面
* */
try {
Person person = new Person();
person = null;
System.out.println(person.getName());
int n1 = 11;
int n2 = 0;
int res = n1 / n2 ;
System.out.println(res);
} catch (NullPointerException e){
System.out.println("空指针异常=" + e.getMessage());
}catch (ArithmeticException e){
System.out.println("数学算数异常=" + e.getMessage());
}catch (Exception e) {
e.printStackTrace();
}
}
}
class Person{
private String name;
public String getName() {
return name;
}
}
内容:
可以进行try-finally配合使用,使用这种方法相当于没有捕获异常,因此程序会直接崩掉退出
package com.ylxstudy.exception_.try_;
/**
* @author
* @version 1.0
* try-finally配合使用
*/
public class TryCatchDetail03 {
public static void main(String[] args) {
/*
* 可以进行try-finally配合使用,使用这种方法相当于没有捕获异常
* 因此程序会直接崩掉退出,
* */
try {
int n1 =10 ;
int n2 =0;
System.out.println(n1 / n2);
} finally {
System.out.println("执行了Finally..");
}
System.out.println("程序继续执行..");
}
}
throw异常处理
throw异常处理,当一个方法中出现异常时,该方法没有进行异常处理,而是将它交给上一级的方法,也就是调用出现异常的方法,此时如果该方法没有进行try-catch,则需要继续throws到上一级调用的,直到JVM,最后JVM显示异常,直接停止运行
- 当异常是运行异常时,进行throws异常处理可以不需要在方法名或者类名后面显式的throws,默认就是throws
- 当异常是编译异常时,就需要进行显式的throws异常处理
package com.ylxstudy.exception_.throws_;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* @author
* @version 1.0
*/
public class Throws01 {
public static void main(String[] args) {
}
// public void f1() throws FileNotFoundException {
public void f1() throws Exception {
//创建一个文件流对象
//这里的异常是一个FileNotFoundException的编译异常
//使用throws抛出异常,让调用f1方法的调用者(方法处理)
//throws后面的异常类型可以是方法中产生的异常类型,也可以是他的父类
//throws关键字后也可以是异常列表,既可以抛出多个异常
FileInputStream fis = new FileInputStream("d://aa.txt");
}
}
package com.ylxstudy.exception_.throws_;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* @author
* @version 1.0
* 异常处理的各种细节
*/
public class ThrowsDetail01 {
public static void main(String[] args) {
}
public void f2(){
//1.对于编译异常,程序中必须处理,
//2.对于运行异常,程序中如果没有处理,默认处理机制为 throws
//
}
public static void f3() throws FileNotFoundException{
// f4(); 抛出的是编译异常,必须显示处理
// 所以,f3必须要抛出异常
f4();
}
public static void f4() throws FileNotFoundException {
FileInputStream fileInputStream = new FileInputStream("d://aa.txt");
}
//同理,当一个方法抛出的是运行异常时,调用的该方法的方法就不需要显式的异常处理
}
class Father{
public void method() throws RuntimeException{
}
}
class son extends Father{
//3.子类重写父类的方法时,对抛出异常的规定:子类重写的方法
//所所抛出的异常类型要么和父类的异常一样,要么就是父类的异常类型的子类
//4.throws 和 try-catch只能二选一
@Override
public void method() throws NullPointerException {
super.method();
}
}