导读:异常处理看完这篇就够了,文章较长,建议收藏再看。别忘记素质三连呀!
程序发生不正常情况,即异常,java把异常信息打印到控制台,供程序员参考,程序员可以对程序进行修改,让程序更加健壮。
package ExceptionPcakage;
public class ExceptionTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=10,b=0,c=3;
System.out.println(devide(a,b));
}
public static int devide(int a,int b) {
return a/b;
}
}
- Java中异常是以什么方式存在的?
异常是以类的形式存在。 - 当出现异常时,jvM虚拟机会自动new异常对象,并将异常对象抛出,因此我们能在控制台看到异常信息。
- 异常类在java.lang包下,所以不用导入类。
package ExceptionPcakage;
public class ExceptionTest1 {
public static void main(String[] args) {
// 通过异常类“实例化”异常对象
int a=9,b=0;
NumberFormatException fe =new NumberFormatException("数字格式化异常");
System.out.println(fe);
}
}
什么是UML?有什么用?
UML是一种统一建模语言。
一种图标式语言(画图的),UML不是只用java中使用,只要是面向对象的编程语言,都有UML.一般画UML图的都是软件架构师或者说是系统分析师,软件设计师,人员使用。
- UML图就是一个设计图,可以描述类和类之间的关系,层序执行的流程,对象的状态等。就好比盖大楼一样,盖楼之前,会先由建筑师画图纸,图纸上的符号都是标准符号,只要是搞建筑的都能看懂,因为图纸上的标注是一种标准语言。
- 作为程序员,得看懂。
Object下有Throwable(可抛出异常)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理)
- Exception下有两个分支:
编译时异常:(故名思议,必须预先对这些异常进行处理否则编译报错。
RuntimeException:运行时异常,在编写阶段可以不管可以处理。 - 两者都发在在运行阶段,编译阶段是不会发生得,因为只有运行阶段才可以new对象。
错误只要发生,java程序只有一个结果,终止程序得执行,退出JVM。错误是不能被处理的。 - 编译时异常(受检异常,受控异常)和运行时异常(非受检异常,非受控异常)的区别?
编译时异常发生得概率高。
例如:外面下雨,你出去,如果不打伞你可能会生病,而且发生得概率很高。所以我们需要再出门前带上伞。带伞就是预处理。
因此对于一些发生概率较高的异常,需要在运行之前对其进行预处理。 - 而运行时异常发生的概率低。
比如出门被飞机轮子砸到,对于这些概率较低得异常,不需要对其预处理。(如果预处理将活得很累)。
- 第一种:在方法声明的位置上,使用throws关键字,抛给了上一级。谁调用我就抛给谁。
- 第二种:使用try … catch语句进行异常的捕捉。谁也不知道,因为我抓住了。
例如:我是一个集团的销售员,因为失误造成公司损失了1000元。(看作是一个异常发生)
第一种方式:我把这件事告诉我的领导【异常上抛】
第二种方式:我自己掏腰包补上。【异常的捕捉】 - 思考:如果异常发生后,我选择了上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两者处理方式。
- 注意:java中异常发生后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了Jvm,jvm知道这个异常发生,终止程序的执行。
- 上抛等于推卸责任,抛给其调用者,捕捉是解决了问题。
- 我们主要处理编译异常。
- 可以抛异常的父类,因为父类包括其异常类,throws后面可以写多个异常。
- 我们只需要处理编译性异常即可,运行时异常不处理也可以。
- catch(异常类型 参数名)的参数保存的时出现异常的对象地址。 catch执行完后,其后的代码可以执行,但try代码块异常行后的代码不会执行。
- 只要异常没有捕捉 ,采用上报的方式,此方法的后续代码不会执行,即方法结束,相当于return。
- 并且如果try语句块中 某一行代码出现异常,改代码后面的代码不会执行。
- 可以写多个catch(),其会自动选择,catch尽量类型错误尽量具体,子类的类型的catch不须写在父类前(从上到下,从小到大)。
- jdk8中catch的异常类型可以用或(“|”)选择多个异常。
- 开发中如果想要调用者知道,就让调用者处理,根据实际情况选择处理方式。
- getMassage()获取异常简单的描述信息。
- printStackTrace() 打印异常追踪的堆栈信息。采用了异步线程的方式打印的。(打印异常信息,异步输出)
查看异常信息:sun写的就不用看,从上往下看自己写的。 - thorw 手动抛异常。
- 在finally子句最后执行的,并且一定会执行, 即使try语句块出现了异常,finally子句必须和try一起出现,不能单独书写。
- 流使用完要关闭,出现异常也要关闭。
- try可以直接和finally连用,不用catch.
- try不能单独使用。
- return执行方法结束,但就算try中有return,也会执行finally语句块,return最后执行。但退出jvm后finally的代码就不执行了,虽然finally充了钱,哈哈。
- finally面试题
java中自上而下执行。返回100.- final ,finally,finalize的区别
- final ,finally,finalize的区别
- finalize是gc负责调用的。
- sun公司提供的JDK的内置异常肯定是不够的,在实际开发中,我们很多业务出现异常可能是JDK中没有的,这时我们需要自定义异常。
- 第一步:编写一个类继承EXception或者RuntimeException.
- 第二步:提供两个构造方法,一个无参数的,一个带有String参数的。
- 程序中哪里出现异常,就用thow 手动抛异常。
- 方法覆盖时,重写的方法不能比父类的方法抛出更多(更宽泛)的异常,可以更少。
- 小练习:
//主类
package Package1;
import java.util.Scanner;
public class ExceptionPractice1 {
public static void main(String[] args) {
UersService aa = new UersService();
Scanner Scan = new Scanner(System.in);
System.out.println("请输入用户名:");
String Name = Scan.next();
System.out.println("请输入密码:");
String Code = Scan.next();
try {
aa.register(Name,Code);
} catch (MyException e) {
e.printStackTrace();
}
}
}
//用户类
package Package1;
public class UersService {
private String AccountName;
private String AccountNameCode;
public UersService() {
}
public UersService(String accountName, String accountNameCode) {
AccountName = accountName;
AccountNameCode = accountNameCode;
}
public String getAccountName() {
return AccountName;
}
public void setAccountName(String accountName) {
AccountName = accountName;
}
public String getAccountNameCode() {
return AccountNameCode;
}
public void setAccountNameCode(String accountNameCode) {
AccountNameCode = accountNameCode;
}
// 注册
public void register(String a,String b)throws MyException{
if(a==null||a.length()>14||a.length()<4)
throw new MyException("用户名请长度应为6到16");
else if(b.length()<6||b.length()>18)
throw new MyException("密码长度应为6到18");
else
System.out.println("登入成功!欢迎你:"+a);
}
}
//自定义异常类
```go
package Package1;
public class MyException extends Exception{
public MyException() {
}
public MyException(String message) {
super(message);
}
}