异常
Exception RuntimeException
常见异常
package com.lxw.java01;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
import org.junit.Test;
/*
* 一、异常体系结构
*
* java.lang.Throwable
* |-----java.lang.Error:一般不编写针对性的代码进行处理。
* |-----java.lang.Exception:可以进行异常的处理
* |------编译时异常(checked)
* |-----IOException
* |-----FileNotFoundException
* |-----ClassNotFoundException
* |------运行时异常(unchecked,RuntimeException)
* |-----NullPointerException
* |-----ArrayIndexOutOfBoundsException
* |-----ClassCastException
* |-----NumberFormatException
* |-----InputMismatchException
* |-----ArithmeticException
*
*
*
* 面试题:常见的异常都有哪些?举例说明
*/
public class ExceptionTest {
//******************以下是编译时异常***************************
@Test
public void test7(){
// File file = new File("hello.txt");
// FileInputStream fis = new FileInputStream(file);
//
// int data = fis.read();
// while(data != -1){
// System.out.print((char)data);
// data = fis.read();
// }
//
// fis.close();
}
//******************以下是运行时异常***************************
//ArithmeticException分母为0
@Test
public void test6(){
int a = 10;
int b = 0;
System.out.println(a / b);
}
//InputMismatchException输入
@Test
public void test5(){
Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();
System.out.println(score);
scanner.close();
}
//NumberFormatException转数字
@Test
public void test4(){
String str = "123";
str = "abc";
int num = Integer.parseInt(str);
}
//ClassCastException强转
@Test
public void test3(){
Object obj = new Date();
String str = (String)obj;
}
//IndexOutOfBoundsException下标越界
@Test
public void test2(){
//ArrayIndexOutOfBoundsException
// int[] arr = new int[10];
// System.out.println(arr[10]);
//StringIndexOutOfBoundsException
String str = "abc";
System.out.println(str.charAt(3));
}
//NullPointerException空指针
@Test
public void test1(){
// int[] arr = null;
// System.out.println(arr[3]);
String str = "abc";
str = null;
System.out.println(str.charAt(0));
}
}
异常处理
try-catch-finally
throws + 异常类型
抓抛模型
过程一:“抛”:程序正常执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。一旦抛出对象后,其后的代码就不再执行。
关于异常对象的产生:1.系统生成。2.手动生成一个异常对象,并抛出(throw)。
过程二:“抓”:try-catch-finally / throws + 异常类型
-
try-catch-finally
try{ }catch (Exception e) { }finally { }
常用的异常处理方式:e.printStackTrace();和e.getMessage();
finally:像数据库连接,输入输出流,网络编程Socket等资源,JVM是不能自动回收的,我们需要手动进行资源释放,声明在finally中。trycatchfinally可以嵌套
-
throws + 异常类型
(往上抛,其实没有解决)
子类重写父类的方法,抛出的异常范围要比父类要小
如果父类没有throws抛出异常,则子类重写也不能使用throws,所以只能使用trycatchfinally
手动抛出异常
package com.lxw.java02;
import com.lxw.java01.EcDef;
public class EcmDef {
public static void main(String[] args) {
try {
int int1 = Integer.parseInt(args[0]);
int int2 = Integer.parseInt(args[1]);
int result = ecm(int1, int2);
System.out.println(result);
} catch (NumberFormatException e) {
System.out.println("数据类型不一致");
}catch (ArrayIndexOutOfBoundsException e) {
System.out.println("缺少命令行参数");
}catch (ArithmeticException e) {
System.out.println("除0");
}catch (EcDef e) {
System.out.println(e.getMessage());
}
}
public static int ecm(int i,int j) throws EcDef{
if (i<0 ||j<0) {
throw new EcDef("分子分母为负数");
}
return i/j;
}
}
package com.lxw.java01;
public class EcDef extends Exception{
static final long serialVersionUID = -7034897193246789L;
public EcDef(){
}
public EcDef(String msg){
super(msg);//传参,e.getMessage()获得
}
}
评论区