异常
1.异常:在程序的执行过过程中,程序出现了一些问题
2.异常的体系结构:
Throwable:Java语言中所有错误或异常的父类
Throwable两个子类:
(1)Error:严重问题,需要借助第三方技术解决
(2)Exception:不是很严重问题,有运行时期异常和编译时期异常
2.1 运行时期异常:RuntimeException
出现原因:代码逻辑不严谨
public class ExceptionDemo {
public static void main(String[] args) {
int a = 20;
int b = 0;
System.out.println(a/b);
}
}
会将异常打印在控制台上:
2.2 编译时期异常:只要不是RuntimeException的子类都属于编译时期异常
出现原因:jvm在检查语法的时候,针对某些特定的方法进行判断,如果不解决,程序执行不了
有些方法本身自带异常,如果不处理,无法运行程序
3.异常的处理方案:
(1)一般开发中常用:捕获异常
标准格式:try…catch…finally
(2)throw/throws:抛出异常
方式一:捕获异常
变形格式:try…catch…
try…catch…catch…
try…finally…
public class ExceptionDemo {
public static void main(String[] args) {
try {
int a = 20;
int b = 0;
System.out.println(a/b);
} catch (ArithmeticException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class ExceptionDemo2 {
public static void main(String[] args) {
int result = method1(20);
System.out.println(result);
}
private static int method1(int x) {
try {
x = 30;
int y =0;
System.out.println(x/y);
} catch (ArithmeticException e) {
System.out.println("0不能为除数");
x = 50;
return x;
}finally {
x = 60;
}
//return y;
return x;
}
}
finally中的语句一定会执行,除非是在执行Finally代码之前,Jvm退出了,在try…catch…finally…中,catch中如果有return语句的话,finally中代码还会执行,在执行finally语句之前,方法已经形成回路径,在执行前就已经返回了。
方式二:抛出异常
抛出:throws和throw的区别:
(1)位置不同:
throws:是在方法声明上抛出
throw:是在方法体中抛出
(2)两个关键字后面的类型不一样:
throws:后面跟的是异常类名,而且可以跟多个异常类名,中间用逗号隔开
throw:后面跟异常对象名,不能跟uoge异常对象,只能跟一个
(3) throws:表示产生异常的一种可能性
throw:表示产生异常的一种肯定性
(4) throws:抛出的异常由它的调用者进行处理
throw:方法中的语句进行处理(加入一些逻辑判断)
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo {
public static void main(String[] args) {
method1(20);
try {
method2();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void method1 (int x) {
x = 30;
int y = 0;
if(y!=0) {
System.out.println(x/y);
}else {
throw new ArithmeticException();
}
}
public static void method2() throws ParseException {
String s = "2020-8-15";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
Date date = sdf.parse(s);
}
}