在日常的编写代码中,难免会遇到很多错误,有时在编写前便可以得到解决,但有时的错误特殊,只有在运行时才可以遇到,很多一场不是靠编写代码能够解决的,
比如: 内存溢出,数组下标越界,输入时异常,运算时异常,空指针异常…
还有些:用户输入数据时格式异常,文件读写是否存在,网络问题…
大概在分类上可以把异常分为两大类:
虚拟据无法解决的严重问题:比如:
JVM系统内部错误,资源耗尽,这种情况无法通过我们编写代码解决,所以不做处理
因为编程错误或者偶然的外在因素:
内存溢出,数组下标越界,输入时异常,运算时异常,空指针异常…
这些情况下,可以通过编写异常处理代码来解决问题,使得编写的代码,在遇到异常时还可以继续执行下去.
另一种就是终止程序的进行了;
编译时没有问题,但是在运行时因为各种各样的问题出现的异常,
数学异常
空指针异常
数组下标越界
输入时异常
内存溢出
这类异常比较常见,一般可以被编译器检测出解决;
IOException
SQLException
异常处理一般通过语言中的关键字,
java中处理异常的关键字有5个:
try
catch
finally
throw
throws
try—>可能异常的代码块
catch---->捕获异常,返回异常后的提示
finally---->无论是否异常,该代码块总能被执行.
throws—>声明方法可能要抛出的所有异常
throw—>手动抛出异常
try{
//可能出错的代码
}catch(错误类型){
//错误提示
}
后续代码
//嵌套也可
try{
//可能出错的代码
try{
//可能出错的代码
}catch(错误类型){
//错误提示
}
}catch(错误类型){
//错误提示
}
后续代码
try{
//可能出错的代码
}catch(错误类型){
//错误提示
}catch(错误类型){
//错误类型提示
}
getMessage()—>获取异常信息,返回字符串
printStackTrace()—>获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
catch(Exception e){
System.out.println(e.getMessage);
e.printStackTrace();
}
当try中有多个异常时,只会抛出最先遇到的哪一个
try {
String s1 = null;
System.out.println(s1.length());
int a2 = Integer.valueOf("adc");
System.out.println(a2);
int[] a = new int[5];
System.out.println(a[5]);
}catch (NullPointerException ex){
System.out.println("s1为空");
}catch (NumberFormatException ex){
System.out.println("输入错误");
}catch (Exception ex){
System.out.println("错误类型:"+ex.getMessage());
}
>>>s1为空
package com.cxy.JavaException.day1;
public class Demo2 {
public static void main(String[] args) {
try {
String s1 = "asjdlk";
System.out.println(s1.length());
int a2 = Integer.valueOf("123456");
System.out.println(a2);
int[] a = new int[5];
System.out.println(a[5]);
}catch (NullPointerException ex){
System.out.println("s1为空");
}catch (NumberFormatException ex){
System.out.println("输入错误");
}catch (Exception ex){
System.out.println("错误类型:"+ex.getMessage());
}
System.out.println("last java");
}
}
必须要执行的字段
package com.cxy.JavaException.day1;
public class Demo3 {
public static String TTry(){
try{
String s1 = null;
System.out.println(s1.length());
}catch (Exception e){
System.out.println(e.getMessage());
return 404+" notfind";
}finally {
System.out.println("必须执行");
}
return 200+"OK";
}
public static void main(String[] args) {
System.out.println(TTry());
}
}
>>>null
>>>必须执行
>>>404 notfind
>>>
>>>Process finished with exit code 0
定义一个方法的时候使用throws修饰,表示这个方法不处理异常,直接抛出,交给调用的方法处理
1.任何方法都可以使用throws修饰
2.子类重写父类的方法时,子类不能抛出比父类类型更大的异常
3.使用throws 修饰的方法,在使用的时候,必须用 throws修饰或者使用 try–catch语句
public static int ab(int a , int b) throws ArithmeticException{
return a/b;
}
用于显式抛出异常,抛出一个异常的实例化对象,try在运行中捕获一个异常对象,那么这个异常对象也可以自己抛出
public static int ac(int a) throws ArithmeticException{
if(a>100||a<0){
throw new ArithmeticException("分数不合法!");
}
return a;
}
throw用于方法体中,抛出一个实际的对象,调用时可以使用throws修饰方法,或者使用try-catch
throws用于方法声明时,用来抛出对应类型的异常,表示该异常在这里不处理,调用时处理
package com.cxy.JavaException.day1;
public class Demo4 {
public static void main(String[] args) {
try{
ab(5,0);
}catch (ArithmeticException e){
System.out.println("分母不为零");
}
// try {
// System.out.println(ac(101));
// }catch (Exception e){
// System.out.println(e.getMessage());
// }
System.out.println(ac(105));
}
public static int ab(int a , int b) throws ArithmeticException{
return a/b;
}
public static int ac(int a) throws ArithmeticException{
if(a>100||a<0){
throw new ArithmeticException("分数不合法!");
}
return a;
}
}
自定义异常就是一些java中没有,但我们实际写代码时候需要用到的某些异常,比如:分数不能小于0,大于满分,我们就可以自定义异常,
基本语法:基本语法
public class 异常类名 extends Exception/RuntimeException{
public 异常类名(String msg){
super(msg);
}
}
在定义时,自定义异常不需要写方法,只需要重写要使用的构造方法, 继承Excaption或者某个异常,使用时要抛出
//自定义异常
package com.cxy.JavaException.day1;
/**
* 自定义异常
*/
public class MyExcaption extends Exception{
public MyExcaption(String s1){
super(s1);
}
}
//测试类
package com.cxy.JavaException.day1;
public class Demo5 {
public static int cc(int a) throws MyExcaption {
if (a<0||a>100){
throw new MyExcaption("我劝你耗子尾汁");
}
return a;
}
public static void main(String[] args) {
try {
System.out.println(cc(105));
}catch (Exception a){
System.out.println(a.getMessage());
}
}
}