JavaSE进阶:472-489异常

开始时间2020-11-09

异常

巧了,异常的try,Python也有:
https://blog.csdn.net/qq_43568982/article/details/105207222

package BUPT20201109;

public class exceptionTest {
    public static void main(String[] args) {
        //异常类可以创建异常对象,异常在Java中以类的形式存在
        NumberFormatException nfe = new NumberFormatException("数字格式化异常!");
        System.out.println(nfe);
    }
}

异常的UML描述继承结构
UML 统一建模语言
可以描述类与类的关系,程序执行的过程,对象的状态
相当于建筑师设计图纸
在这里插入图片描述
编译时异常必须在编译阶段预处理,预判他的异常会发生在哪(看了天气预报可能下雨,所以准备了伞)
所有异常都是在异常阶段发生的
异常的发生就是new 异常对象
编译时异常发生概率比运行时异常概率高
运行时异常不需要预处理,因为处理这种小概率事件会让程序变得冗杂,效率很低
编译时异常又可以称为受控/受检异常 checkedException
运行时异常称为非受控/未受检异常 uncheckedException

异常处理两种方式:
1.在方法声明的位置,使用throws关键字,抛给上一级,谁调用我,我丢给谁
2.try catch进行异常捕捉
在这里插入图片描述
上抛后,上一级又是处理这两种处理方式的选择之中
上抛给main->JVM,那就终止Java程序了

package ExceptionTest;

public class ExceptionTest01 {
    public static void main(String[] args) {
        doSome();
    }
    //找不到类对象,直接父类是Exception,属于编译时异常
    //在调用doSome时就要预处理才行
    public static void doSome() throws ClassNotFoundException{
        System.out.println("牛逼");
    }
}

报错,未处理异常

解决方法1:在main上继续上抛

package ExceptionTest;

public class ExceptionTest01 {
    public static void main(String[] args) throws ClassNotFoundException{
        doSome();
    }
    //找不到类对象,直接父类是Exception,属于编译时异常
    //在调用doSome时就要预处理才行
    public static void doSome() throws ClassNotFoundException{
        System.out.println("牛逼");
    }
}

解决方法2:try catch捕捉

package ExceptionTest;

public class ExceptionTest01 {
    public static void main(String[] args) throws ClassNotFoundException {
        try {
            doSome();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void doSome() throws ClassNotFoundException {
        System.out.println("牛逼");
    }
}

案例2:

package ExceptionTest;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionTest02 {
    public static void main(String[] args) throws {
        System.out.println("mainbegin");
        m1();
        System.out.println("mainover");
    }

    private static void m1() throws {
        System.out.println("m1begin");
        m2();
        System.out.println("m1nover");
    }

    private static void m2() throws {
        System.out.println("m2begin");
        m3();
        System.out.println("m2nover");
    }

    private static void m3() throws  {
        new FileInputStream("F:\\编程学习\\Java学习\\学习啊.txt");
        //编译时异常
    }
}

解决方法1,一直上抛

package ExceptionTest;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionTest02 {
    public static void main(String[] args) throws FileNotFoundException{
        System.out.println("mainbegin");
        m1();
        System.out.println("mainover");
    }

    private static void m1() throws FileNotFoundException{
        System.out.println("m1begin");
        m2();
        System.out.println("m1nover");
    }

    private static void m2() throws FileNotFoundException{
        System.out.println("m2begin");
        m3();
        System.out.println("m2nover");
    }

    private static void m3() throws FileNotFoundException {
        new FileInputStream("F:\\编程学习\\Java学习\\学习啊.txt");
        //编译时异常
    }
}

mainbegin
m1begin
m2begin
m2nover
m1nover
mainover

漏掉任何一个都会报错
FileNotFoundException->Exception
也可以直接写Exception

解决方法2
最后给try-catch

package ExceptionTest;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionTest02 {
    public static void main(String[] args) {
        System.out.println("mainbegin");
        try {
            m1();
        } catch (Exception e) {
            System.out.println("路径错误!");
        }
        System.out.println("mainover");
    }

    private static void m1() throws Exception {
        System.out.println("m1begin");
        m2();
        System.out.println("m1nover");
    }

    private static void m2() throws Exception {
        System.out.println("m2begin");
        m3();
        System.out.println("m2nover");
    }

    private static void m3() throws Exception {
        new FileInputStream("F:\\编程学习\\Java学习\\学习啊.txt");
        //编译时异常
    }
}

只要捕捉了就不会往上报,try被抓住的话,try后面不运行,运行catch后
catch后面可以写具体的异常类型,也可以是该异常的父类型
也可以放多个异常,但小异常不能放在大异常之后

package BUPT20201109;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionTest01 {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("E:\\编程学习\\Java学习\\Java代码学习\\Java代码.txt");
        } catch (FileNotFoundException e) {
            System.out.println("文件不存在!");
        } catch (Exception a) {
            System.out.println("文件不在!");
        }
    }
}

或者一个catch后面跟多个判断

        try {
            FileInputStream fis = new FileInputStream("E:\\编程学习\\Java学习\\Java代码学习\\Java代码.txt");
        } catch (FileNotFoundException | ArithmeticException e) {
            System.out.println("文件不存在!");
        } catch (Exception a) {
            System.out.println("文件不在!");
        }

异常对象的常用方法

package BUPT20201109;

/*
异常对象有两个非常重要的方法:
获取异常简单的描述信息
String msg=exception.getMessage();
打印异常追踪的堆栈信息:
exception.printStackTrace();
 */
public class ExceptionTest02 {
    public static void main(String[] args) {
//new了异常对象,但是没有抛出异常对象,当做普通Java对象
        NullPointerException npe = new NullPointerException("空指针异常");
        String msg = npe.getMessage();
        //返回构造方法的参数
        System.out.println(msg);
        //打印异常堆栈信息的
        //采用了异步线程的方式
        npe.printStackTrace();
        System.out.println("Hello World");
    }
}

空指针异常
Hello World
java.lang.NullPointerException: 空指针异常
	at BUPT20201109.ExceptionTest02.main(ExceptionTest02.java:13)

Process finished with exit code 0

如果文件确实存在

package BUPT20201109;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionTest03 {
    public static void main(String[] args) throws FileNotFoundException {
        m1();
    }

    private static void m1() throws FileNotFoundException {
        m2();
    }

    private static void m2() throws FileNotFoundException {
        m3();
    }

    private static void m3() throws FileNotFoundException {
        new FileInputStream("E:\\编程学习\\Java学习\\Java代码学习\\Java代码.txt");
    }
}

alt+enter可以不断创建还没创建但先调用了的函数,也可以不断的提供上抛快捷生成方式
当然,如果实在是有问题的,还是会报错

Exception in thread "main" java.io.FileNotFoundException: E:\编程学习\Java学\Java代码学习\Java代码.txt (系统找不到指定的路径。)
	at java.base/java.io.FileInputStream.open0(Native Method)
	at java.base/java.io.FileInputStream.open(FileInputStream.java:211)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:108)
	at BUPT20201109.ExceptionTest03.m3(ExceptionTest03.java:20)
	at BUPT20201109.ExceptionTest03.m2(ExceptionTest03.java:16)
	at BUPT20201109.ExceptionTest03.m1(ExceptionTest03.java:12)
	at BUPT20201109.ExceptionTest03.main(ExceptionTest03.java:8)

看异常看这一条

	at BUPT20201109.ExceptionTest03.m3(ExceptionTest03.java:20)

结束时间 2020-11-10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值