[Java] 纯文本查看 复制代码
package com.edu_01;
/**
* 异常演示:
* 除数不能为0
*
* java.lang.ArithmeticException: / by zero
*
* 当我们的程序出现异常的时候我们的jvm虚拟机会给一个默认的处理方式:
* 1.从出现异常的地方将程序停止掉
* 2.将出现的异常类名,异常的原因,还有出现异常的位置全部打印到控制台
*
* 你觉得jvm虚拟机给出的这种默认的处理方式好吗?
* 答:不好,因为我们的程序是由多个部分组成,一旦一个部分出现了异长,
* 我们不应该让 程序直接停止掉,应该让程序的其他模块继续正常运行,而针对这一个出现的异长给出一个
* 具体的处理方案,这个处理方案最好不要影响到其他模块的程序执行
*
*/
public class ExceptionDemo2 {
public static void main(String[] args) {
System.out.println("start");
int a = 10;
int b = 0;
System.out.println(a/b);//java.lang.ArithmeticException: / by zero
System.out.println("end");
}
}
[Java] 纯文本查看 复制代码
package com.edu_01;
/**
* * 我们是如何处理异常,保证各个部分不影响的呢?
* 两种方案:
* A:try...catch...finally
* B:throws
*
* try...catch...finally:
* try{
* 可能出现异常的代码
* }catch(异常类名 变量名) {
* 针对异常的代码处理
* }finally {
* 释放资源的地方
* }
*
* 我们简化一下第一个:
* try{
* 可能出现异常的代码
* }catch(异常类名 变量名) {
* 针对异常的代码处理
* }
*
*/
public class ExceptionDemo3 {
public static void main(String[] args) {
System.out.println("start");
int a= 10;
int b = 0;
try{
//可能出现异常的代码
System.out.println(a/b);//当除数为0的时候会抛出ArithmeticException这个异常
//接着程序会拿着这个异常和catch里面的异常类已经对比
}catch(ArithmeticException e){
//当程序抛出ArithmeticException这个异常之后给出的具体的处理方法
System.out.println("你的除数不能为0");
}
System.out.println("end");
}
}
[Java] 纯文本查看 复制代码
package com.edu_02;
import java.io.FileNotFoundException;
public class Animal {
public void method() throws FileNotFoundException{}
public void function(){}
}
package com.edu_02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Cat extends Animal{
//重写父类的method()方法
//A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
public void method() throws FileNotFoundException{}
//C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
//重写父类的function方法
public void function(){
//因为父类中没有任何异常抛出,子类重写的方法中如果有异常,只能抓不能抛
try{
FileInputStream fis = new FileInputStream("D://a.txt");
}catch(FileNotFoundException e){
System.out.println("文件未找到");
}
}
}
package com.edu_02;
/**
* 1.9.1
* 注意:
* A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
* B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
上述仅仅针对编译时期异常
与运行时期异常无关。
*
*/
public class ExceptionDemo {
}
[Java] 纯文本查看 复制代码
package com.edu_01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* 1.4
* 编译时期异常和运行时期异常的区别:
* 编译时期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
* FileNotFoundException(文件未找到异常)
* 运行时期异常:无需显示处理,也可以和编译时异常一样处理
* ArithmeticException
*/
public class ExceptionDemo5 {
public static void main(String[] args) {
// * 运行时期异常:无需显示处理,也可以和编译时异常一样处理
// 什么是异常的显示处理:try...catch...
// ArithmeticException
try{
System.out.println(10/0);
}catch(ArithmeticException e){
System.out.println("除数为0");
}
/**
* 编译时期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
* FileNotFoundException(文件未找到异常)
*/
//此时就会出现一个编译时期的异常,此时程序的异常必须显示处理
try{
FileInputStream fis = new FileInputStream("D://a.txt");
}catch(FileNotFoundException e){
System.out.println("文件没找到");
}
}
}
[Java] 纯文本查看 复制代码
package com.edu_01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* 1.7
* throws:(演示文件未找到异常,除数为0异常)
* 用在方法声明后面,跟的是异常类名
* 可以跟多个异常类名,用,号隔开
* 表示抛出异常,由该方法的调用者来处理
* throws表示出现异常的一种可能,并不一定会发生这些异常
*/
public class ExceptionDemo7 {
public static void main(String[] args){
method();
//method2();//将这个异常交给了调用者去进行处理
//1.可以继续往上throws,将异常继续向上进行抛出了
//2.自己try..catch...,相当与自己处理了这个异常
try{
method2();
}catch(FileNotFoundException e){
System.out.println("文件未找到");
}
/**
* 我们以后遇到异常是抛还是抓呢?
* 答:原则上能抛就抛,等到已经抛到了程序最底层的时候,最好就不要抛了,自己抓取。
*/
}
private static void method2() throws FileNotFoundException {
//此时会抛出一个编译时期的异常,
//我们必须在方法上进行声明,如果不声明的话,会一直编译报错
FileInputStream fis = new FileInputStream("D://a.txt");
}
private static void method() throws ArithmeticException {
//在方法声明上声明这个方法可能出现的异常,不代表这个异常一定会出现
//此时仅仅是告诉我的调用者我的这个方法可能会出现异常,并不做具体的处理,交给
//调用者自己去处理这个异常
//此时抛出的 出数为0的异常,属于运行时期异常
System.out.println(10/5);
}
}
[Java] 纯文本查看 复制代码
package com.edu_01;
/**
* 1.8
* 异常处理:
* try...catch...finally
*
* finally:一般用于释放资源。在数据库操作或者IO流比较常见。
*
* 特点:
* 被finally控制的语句体一定会执行
*
* 特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
*
*/
public class ExceptionDemo8 {
public static void main(String[] args) {
try{
System.out.println(10/0);
}catch(ArithmeticException e){
System.out.println("除数为0了");
//在执行finally语句体之前jvm虚拟机退出了,那么就不会被执行
System.exit(0);
}finally{
//这个代码块里面的代码一定会被执行的
System.out.println("我是finally我一定会被执行");
}
}
}