开始时间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