本人码云(建议pc端打开,手机可能会出现字体过小问题。)
本人会不定期在码云上更新一些算法或数据结构的基础程序,后期也会学习进阶程序,也会更新大厂的面试题。
如果您有好的建议和想法,欢迎在本人码云相应代码评论区评论哦。希望大家都能在编程这条路上越走越远。也祝看到这篇博客的人,能真正搞懂这方面知识,当然,若有错误,请提出改正,谢谢大家啦。
本人后续会在这里更新操作系统和计组的笔记,敬请期待!
有赞必回,评论必回,顺着网线回访!
Java异常
异常的基本语法
异常:程序没按照预计的结果运行,在运行过程中发生了“错误”。
异常的基本语法:
try
{
//可能会产生异常的代码,除0,数组越界,空指针等
}
[catch 0..N个]
{
//出现异常以后如何处理
}
[finally]
{
//异常的出口,最终会执行的代码块
}
catch, finally 为可选,可写可不写
其实try语句后面是可以省略catch语句的,但是必须有finally语句。也可以省略finally语句,但是必须要有catch语句。也就是说try语句后面必须要有一个别的语句跟在后面。有如下三种:
try-catch
try-finally
try-catch-finally
1.程序中不处理异常
2.使用try … catch … 处理异常
我们发现,一旦try中出现异常,那么try代码块中的其他程序就不会继续执行,而是交给catch中的代码来执行,catch执行完毕后继续向下执行
。
3.异常类
Java中一切都是类,
异常其实也是类,因此catch代码块只能捕获相应的异常“类型”
。
例:
有一个异常类是所有异常类的父类,Exception
我们如果catch块中捕获的是Exception类型,那么就可以接受所有的异常类型。(自动向上转型
)
这样虽然可以一劳永逸,但是不推荐,因为这样写,不知道异常产生的具体原因,如果很清楚异常产生的类型,建议还是写对应的Exception的子类异常。
4.关于错误“堆栈”信息
如果想要输出程序出现异常的位置以及原因,就调
用异常对象
的printStackTrace
方法e.printStackTrace();
在Java中,出现问题很好解决,异常的错误信息非常完善,到底在哪一行出现了什么错误,说的非常清楚。
5.关于finally代码块
无论是否有异常产生,最终都会执行finally代码块 (易错)
猜猜这个ret是多少?
不可思议是 30
finally作为最终都会执行的代码块,若finally中存在返回值,覆盖掉try或者catch的返回值
所以,不要在finally代码块中写返回值
。
一般来说资源的释放,方法的关闭操作都在finally代码块中。 比如关闭数据库的连接,关闭文件的操作都在finally块中,无论是否有异常产生,都能保证资源得到释放。
6.异常处理
流程
7.throws和throw关键字
人为抛出异常
- throws: 用在方法声明上,表示该方法可能会产生的异常类型,但是本方法中不处理该异常。若异常产生抛回给调用者。
- throw: 用在方法内部,表示人为产生异常对象并抛出。
异常对象的产生都是发生异常后由JVM产生的,若需要人为产生异常对象,就使用throw关键字。
如果我用
e.printStackTrace();
会怎么样?
8.异常体系
JDK内部异常的继承关系
Java中的异常分为两大类,一类称之为 “受查异常”,另一类称为 “非受查异常”。
RuntimeException以及其子类包括Error及其子类称之为非受查异常
, 编译阶段可以不显示进行异常处理
(try … catch / throw 抛出等等)。即蓝色部分的类除了非受查异常以外的其他异常都是受查异常,必须在编译阶段
显示进行异常的处理
,否则编译就会出错。即红色部分的类
RuntimeException
:运行时异常,编译阶段不报错,运行时出错。
常见的运行时异常
ArrayIndexofBoundsException - 数组越界异常
NullPointerException - 空指针异常
ClassCaseException - 类型转换异常
Error
:程序内部错误,一般来说出现这种错误,程序没法再正常执行下去,只能退出程序。
OutofMemoryError - 堆内存溢出错误
StackOverflowError - 栈溢出错误
代码体验:
非受查异常
受查异常,必须在编译阶段进行异常的处理
这个抛出的这个异常是受查异常,调用者必须显示处理
这个代码因为没有file文件,将会产生FileNotFoundException
异常,由于FileInputStream这个类它抛出了这个异常,交给调用者去处理,我自己写的IOException这个类中的main方法
就是调用者,如果我不想处理,那我让main也抛出这个异常就好了。
显示处理:
1.进行 try…catch…finally 捕获这个异常
2.调用者也使用 throws 向上抛出
9.自定义异常
JDK内部已经帮我们提前定义好了很多的异常类,但是在某些业务场景下,出现的错误需要我们自定义异常类(用户登陆的时候,用户名不对,密码不对等等)
自定义异常类非常简单,只需要继承相关的两个父类就可以。
若希望这个异常类
必须显示处理
- 继承Exception
父类
若希望这个异常类不需要显示
处理 - 继承RuntimeException
父类
package java_exception_test;
import java.net.PasswordAuthentication;
import java.sql.SQLOutput;
import java.util.Scanner;
public class MyExceptionTest
{
private static final String USER_NAME = "lee";
private static final String PASSWORD = "12345";
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String userName = sc.nextLine();
System.out.println("请输入密码:");
String pass = sc.nextLine();
if( !USER_NAME.equals(userName) )
{
//用户名错误异常
//先创建一个用户名错误的异常类的对象
UserNameException e = new UserNameException("用户名错误异常");
//再抛出这个异常对象
throw e;
}
if( !PASSWORD.equals(pass) )
{
//密码错误异常
throw new PassWordException("密码错误异常");
}
}
}
//创建两个异常类,继承RuntimeException
//非受查异常 - 不需要进行显示处理
class UserNameException extends RuntimeException
{
//构造方法
public UserNameException(String msg)
{
super(msg);
}
}
class PassWordException extends RuntimeException
{
//构造方法
public PassWordException(String msg)
{
super(msg);
}
}