异常
表示程序在运行过程中出现的非正常情况,编写代码的过程中尽可能少的减少异常出现的情况
- Throwable
- Error 代码级别无法解决的异常情况
- Exception
- 运行时异常:在程序运行过程中,由于输入的参数值的不同,可能会发生也可能不会发生
- checked异常 :编译时异常,在ide中会显示的检查出来
try{
可能出现异常的语句
}catch(可能出现的异常){
捕捉异常后执行的语句
}
//
try{
int x = 1 /0;
}catch(ArithmeticException e){
e.printStack();
}
捕获异常2、
try{
可能发生异常的代码
}catch(发生的异常){
捕捉异常后执行的语句
}finally{
不管是否发生异常都要执行的语句
}
//
try{
int x = 1 /0;
}catch(ArithmeticException e){
e.printStack();
}finally{
System.out.println("finally")
}
注意
-
当发生异常时,在try代码块中异常语句后面的语句不会再执行
-
try、catch、finally以及try…catch…finally之外的代码是互相独立的,在try中定义的变量在其他的部分无法访问,改变了仅作用于try部分,其他catch、finally情况类似,但是外部定义的变量在try、catch、finally中可以使用
-
在进行异常捕获的时候,return语句的不同位置会造成结果的不同
-
首先讨论try…catch…finally后面有代码的情况
-
//此时注意一个关键的点:checked异常,即return语句后面不能再跟语句
// 例如
return;
System.out.println("after return");// 这条语句ide直接报错,相当于多余的
// 故return的语句只能有一下几种情况
//1
try{
System.out.println("1");
System.out.println(1 / 0);
return;
}catch (Exception e){
System.out.println("2");
// return;
}finally {
System.out.println("3");
// return;
}
System.out.println("4");
}
// 此时return语句永远都不会被执行,也就不会报错。
//2
try{
System.out.println("1");
// System.out.println(1 / 0);
return;
}catch (Exception e){
System.out.println("2");
// return;
}finally {
System.out.println("3");
// return;
}
System.out.println("4");
//此时,当程序执行到return语句时,并不会立即执行,而是先挂起,等执行完finally中的语句之后再执行return语句结束程序,故try、catch、finally之外的其他代码不会再执行
//其他的catch、finally中都不能再存在return语句了
2.try…catch…finally后面没有代码的情况
//第一种情况
try{
System.out.println("1");
System.out.println(1 / 0);
return;
}catch (Exception e){
System.out.println("2");
// return;
}finally {
System.out.println("3");
// return;
}
// 此时return语句永远不会执行
// 第二种情况,此时return语句有没有都没有关系
try{
System.out.println("1");
// System.out.println(1 / 0);
return;
}catch (Exception e){
System.out.println("2");
// return;
}finally {
System.out.println("3");
// return;
}
//第三种情况
try{
System.out.println("1");
System.out.println(1 / 0);
// return;
}catch (Exception e){
System.out.println("2");
return;
}finally {
System.out.println("3");
// return;
}
//此时,还是跟前面一样的,return先挂起,执行完finally中的代码后再结束程序
//第三种情况
public class Demo {
public static void main(String[] args) {
System.out.println(method());
}
public static int method(){
try{
System.out.println("1");
System.out.println(1 / 0);
// return;
}catch (Exception e){
System.out.println("2");
return 1;
}finally {
System.out.println("3");
// return 2;
}
// System.out.println("4");
return 0;
}
}
// 此时会执行最近的return语句
综上:
- return语句会被挂起,等执行完finally中的语句后再执行
- 当存在两个return语句时且都能被执行时,优先执行finally中的return
抛出异常
将异常情况抛出给调用者
注意,如果整个程序的运行过程中都没有异常的处理的话,最终异常会抛给jvm,不太友好,一般都要对异常进行处理
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Demo1 {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fileInputStream = new FileInputStream("test.txt");
}
}
自定义异常
java中提供了非常多的异常类,但是在某些项目中需要自己定义独特的异常处理方式,此时需要自定义异常
- 继承Exception
- 编写构造方法,可以传入自己想打印的异常信息
- 调用的时候通过throw向外抛出异常
public class MyException extends Exception{
public MyException(){
System.out.println("自定义异常");
}
}
public class Demo1 {
public static void main(String[] args) throws MyException {
throw new MyException();
}
}
另外,还可以自定义异常信息
public class Demo1 {
public static void main(String[] args) throws Exception {
throw new Exception("test");
}
}
希望对大家有所帮助。