------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
什么异常?
就是程序中出现的一个问题或毛病。对于异常来说,我们在开发中是一定要处理的。
异常分类:
Throwable 类是 Java 语言中所有错误或异常的超类
错误:Error
异常:Exception
对于程序员,我们只能处理Exception,不需要处理Error.
Java中的异常分类:
运行时异常:在运行阶段会出现的异常
编译时异常
JVM默认是如何处理异常的
int a = 10;
int b = 0;
System.out.println(a / b);
程序在编译时,不会有问题,在java.exe将我们的.class文件加载到jvm时,会发现除数为0.这是一个问题,jvm就会将这个问题具体化(就是将问题包装成了对象),对于除数为0这样的问题,在java中使用了这样的类来描述, ArithmeticException,jvm就将这个类的对象抛给了我们,在控制台上的表现就是将这类的一些信息显示出来。
注意:在java中,它已经定义好了一些问题的描述.
例如:数组下标越界 ArrayIndexOutOfBoundsException
将一个字符串转换成数字 有可能出现 NumberFormatException
总结:jvm会将问题包装成具体的异常类对象,并通过这个对象调用它的一些方法,来在控制台上把问题反馈。
try..catch的方式处理异常
异常分类:
运行时异常:RuntimeException及其子类
编译异常:Exception其及子类,但是不包含RuntimeException及其子类
对于异常,运行时异常可以处理也可以不处理
编译异常必须处理。
try…catch格式:
try{
有可能出现异常的代码块;
}catch(异常类型 e){
处理方式
}
运行的代码如果出现的异常,catch会捕获到,你在catch中要捕获的是什么异常,如果出现了,就会将其捕获.
package cn.itcast.throwable;
//异常处理 try....catch处理方式
public class ExceptionDemo2 {
public static void main(String[] args) {
//处理除数为0异常
int a=10;
int b=10;
//System.out.println(a/b); //java.lang.ArithmeticException 运行时异常
//现在我们要使用try...catch来处理异常.
try {
System.out.println(a / b); // 有可能出现异常
} catch (ArithmeticException e) { //catch只有在try块中的代码出现了异常才会执行.
System.out.println("除数不能为0");
}
}
}
编译期异常和运行期异常的区别
1. 编译异常,要求我们必须处理,不处理编译不了代码
运行时异常,你可以处理,也可以不处理,不处理jvm处理。
2. 编译异常 Exception类及其子类,除了RuntimeException及其子类
运行异常 RuntimeException及其子类。
Throwable的几个常见方法
1. public Throwable getCause() 获取原因
2. public String getMessage() 获取错误信息
3. public void printStackTrace() 得到堆栈信息
4. public String toString() 得到异常类包及本地化的信息
package cn.itcast.throwable;
//1. 了解 public Throwable getCause() 获取原因
//2. 重点public String getMessage() 获取错误信息
//3. 重点public void printStackTrace() 得到堆栈信息
//4. 了解public String toString() 得到异常类包及本地化的信息
public class ExceptionDemo6 {
public static void main(String[] args) {
int i = 10;
int b = 0;
// try {
System.out.println(i / b);
// } catch (ArithmeticException e) {
// System.out.println(e.getCause()); //得到原因
// System.out.println(e.getMessage()); // / by zero
// e.printStackTrace();//异常类型 错误信息 定位了异常产生的行号
// System.out.println(e.toString()); //类名 错误信息
// }
}
}
throw的概述以及和throws的区别
问题:throw是什么?
它是用于抛出具体异常的,注意,它抛出的是异常对象。
对于throw,如果执行了,方法体也就结束 了。
在开发中经常会使用throw让我们的方法结束。
throw与throws区别:
1. throws是定义在方法的声明 上的,而throw,是在方法体中使用的
2. throws后面是一个方法类名,throw后是一个对象。
3. throws它只是用于声明这个方法可能抛出某种类型异常,throw它是真正用于抛出一个异常。
final finally finalize 的区别
Final是一个修饰符
修饰属性 常量
修饰方法 不可以被重写
修饰类 不可以被继承
Finally 异常中的,这个块中的内容永远会被执行,用于关闭资源。
Finalize是Object类中的一个方法,用于垃圾回收.
如果在finally之前有return
package cn.itcast.throwable;
//finally使用 如果在finally前出现了 return 或throw有什么情况
public class ExceptionDemo10 {
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
// return; //如果出现了return,那么finally中的内容也会执行.
// throw new RuntimeException(); //如果抛出了异常,那么finally也会被执行.
System.exit(0); // 这句话执行后,finally执行不了.
} finally {
System.out.println("finally");
}
}
}
package cn.itcast.throwable;
public class ExceptionDemo11 {
public static void main(String[] args) {
// int n = show();
// System.out.println(n);
System.out.println(print().x); // 1
}
public static Point print() {
Point p = new Point();
p.x = 10;
try {
throw new Exception();
} catch (Exception e) {
p.x = 100;
return p; //在returnvalue存储的是p引用的地址
} finally {
p.x = 1;
}
}
public static int show() {
int a = 10;
try {
a = 100;
throw new Exception();
} catch (Exception e) {
a = 1000;
return a; // 当执行到return a;
// 这时要返回的a=1000;那么就将1000赋值给了jvm中返回值变量。这时不执行返回动作,转为finally没执行。
} finally {
a = 1;
// return a;
}
}
}
class Point {
int x;
}