异常分类
严重问题Error:
不处理,都是严重问题
问题Exception:
编译期问题
不是RuntimeException及其子类的异常,必须处理,若不处理,编译就不能通过。
运行期问题RuntimeException
不处理,是由于代码不对,修正代码。
异常分类如下图:
java中处理异常的方式
try…catch…finally方式
try…catch…finally的格式
try{
可能出现问题的代码;
}catch(异常名 变量){
针对问题的处理;
}finally{
释放资源;
}
package com.lj.exception;
public class exceptionDemo1 {
public static void main(String[] args) {
int a = 21;
int b = 0;
int[] c = {1,2,3};
try{
int d = a / b;
int e = c[3];
System.out.println(d);
System.out.println(e);
}catch(ArithmeticException e){
System.out.println("除数不能为0");
}catch(Exception e){
System.out.println("数组下表越界");
}
finally {
System.out.println("上面出错了");
}
}
}
实例如上面语句需要注意的1、是在try中一共有两条异常语句,若第一条出错第二条不会在执行。2、捕获异常是我们要注意异常类的继承关系,越靠近父类的异常应放在后面。
执行后的到结果如下:
除数不能为0
上面出错了
finally关键字的使用
public static void main(String[] args) {
System.out.println("今天天气很好");
try {
method();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
System.out.println("但是明天要上班");
}
}
我们在try…catch…finally结构中接入finally语句标示无论在try中是否有异常存在最终finally语句都会执行。
try…catch…finally的变形
throws异常抛出
package com.lj.exception;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo2 {
public static void main(String[] args) {
System.out.println("今天天气很好");
try {
method();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//这里我们用到了一个异常的方法,该方法的作用是打印出异常的情况到控制台终端上。
}
System.out.println("但是明天要上班");
}
//方法声明是抛出,提示调用者这里有异常
private static void method() throws ParseException {
// TODO Auto-generated method stub
String s = "2016-01-17";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse(s);
System.out.println(d);
}
}
运行结果如下:
通过上面代码我们可以看到我们在方法method()中并没有对异常进行处理,而是在方法声明中直接将异常throw,所以回到main方法中ecplise提示我们必须要对异常进行处理,我们就再对main()方法进行try..catch…finally异常处理即可。(提示若在main方法中继续使用throw抛出异常则是将异常抛给了jvm虚拟机,main()后面的语句并不会执行)
提示补充
请注意throw及throws的区别
两种处理方式的使用场景及举例:
自定义异常
除了java提供的异常类之外我们还可以一般有两种类型的自定义异常。
这里我们考虑用考试成绩来做测试(0<分数<100)作为一个有效分数。
首先建立测试类
package com.lj.exception;
import java.util.Scanner;
public class ExceptionDemo4 {
private static Scanner input;
public static void main(String[] args) {
input = new Scanner(System.in);
System.out.println("请输入分数: ");
int score = input.nextInt();
try {
check(score);
} catch (MyException e) {
e.printStackTrace();
}
}
private static void check(int score) throws MyException {
if(score > 100 || score <0){
throw new MyException("分数为0到100");
} else{
System.out.println("分数没错");
}
}
}
继承自Exception
这类异常属于编译时期的异常需要我们必须处理。
public class MyException extends Exception {
public MyException(){
}
public MyException(String message){
super(message);
//在测试类中需我们在抛出异常时printStackTrace()方法可以给出一个提示,最终是使用的
//其父类的父类的getMessage()方法返回到控制台上面。
}
}
继承自RuntimeException
public class MyException extends RuntimeException {
public MyException(){
}
public MyException(String message){
super(message);
//在测试类中需我们在抛出异常时printStackTrace()方法可以给出一个提示,最终是使用的
//其父类的父类的getMessage()方法返回到控制台上面。
}
}
而使用该自定义异常时编译时使用
public static void main(String[] args) {
input = new Scanner(System.in);
System.out.println("请输入分数: ");
int score = input.nextInt();
check(score);
在编译时不会报错,运行时报错。