对于一个程序来讲,有异常再正常不过,因此我们需要学习,如何捕捉异常,分析异常,
异常分为 Error, Exception,而java规定:
- 必须捕获的异常,包括
Exception
及其子类,但不包括RuntimeException
及其子类,这种类型的异常称为Checked Exception - 不需要捕获的异常,包括
Error
及其子类,RuntimeException
及其子类
因此我们在自定义异常的时候,一般会使用RuntimeException进行继承
import java.util.Scanner; class BaseException extends RuntimeException { // 做一下我们自定义基类的初始化,完全按照RuntimeException写的 public BaseException() { super(); } public BaseException(String message) { super(message); } public BaseException(String message, Throwable cause) { super(message, cause); } public BaseException(Throwable cause) { super(cause); } } // 登陆异常类,这个里面继续扩展各种操作 class LoginException extends BaseException { public LoginException() { super(); } public LoginException(String message) { super(message); } public LoginException(String message, Throwable cause) { super(message, cause); } public LoginException(Throwable cause) { super(cause); } } public class HelloWorld { public static void main(String[] args) throws Exception { Scanner s = new Scanner(System.in); System.out.println("name: "); String name = s.nextLine(); System.out.println("password: "); String pwd = s.nextLine(); try { // try catch的捕捉异常语法 String f = login(name, pwd); if (f.equals("success")) { System.out.println("登陆成功"); } } catch (LoginException cause) { // 捕捉异常,必须是这个异常,否则捕捉不到 System.out.println("登陆失败!"); cause.printStackTrace(); } finally { // 无论如何,都会执行finally System.out.println("程序结束"); } } public static String login(String name, String pwd) throws LoginException { if ("ming".equals(name) && "123".equals(pwd)) { return "success"; } else { throw new LoginException("用户名或密码不正确"); // 抛出异常 } } } //情况一: //name: //ning //password: //123 //登陆失败! //程序结束 //LoginException: 用户名或密码不正确 // at HelloWorld.login(HelloWorld.java:42) // at HelloWorld.main(HelloWorld.java:26) //情况2: //name: //ming //password: //123 //登陆成功 //程序结束
在开发阶段,我们也会用到断言,如果断言失败,程序就会退出,因此对于不会导致程序退出的一样,尽量不要用assert,在JVM默认会关闭断言功能,因此如果想要使用可以在终端加上 -ea 参数,断言后面加冒号,写上备注信息,就可以在抛出错误信息时带出,在实际开发中,很少用断言,一般会使用单元测试或者调试,了解就好
public class HelloWorld { public static void main(String[] args) throws Exception { assert 1 > 2: "1 大于2"; System.out.println("end"); } }
➜ src java -ea HelloWorld.java Exception in thread "main" java.lang.AssertionError: 1 大于2 at HelloWorld.main(HelloWorld.java:3)