2020.12.16

2020.12.16

1.方法可变参数

1.1概念

方法可变参数是指方法形参的个数可以变化,个数可以为零,也可以为n个。

1.2定义

例如:

public double area(int...param){

}

1.3规则

(1)一个方法只能有一个可变参数。

(2)如果一个方法有多个参数,那么可变参数必须定义在最后。

(3)方法可变参数本质上是一个数组,因此可变参数可以被当做数组来使用。

1.4调用

方法1:不传入参数

方法2:传入多个离散值

方法3:传入多个数组对象

例如:

public static void area(int...c){

if(c!=null&& c.length>0){

for(int i=0;i<c.length;i++){

System.out.println(c[i]);

}

}

}

public static void main(String[] args){

area();//无参调用,此时area()的参数是空指针

area(1,2,3,4,5);//传入多个离散值,此时area()方法参数c是一个数组,传入的参数是数组元素

int score[] = {67,88,26};

area(score);//传入数组对象,此时area()方法参数c是一个数组

}

2.异常

2.1什么是异常

异常是指程序在运行过程中出现的非正常现象。

2.2异常的体系结构(重点

2.3 Throwable类

Throwable类是异常体系结构的父类,Throwable类的父类是Object。Throwable又派生出两个子类:Error(错误)和Exception(异常)。

2.3.1 Error类

Error是指无法通过开发人员编写程序能够解决的异常。

典型的Error:内存溢出、动态链接失败(加载dll文件)、虚拟机错误

2.3.2 Exception类

Exception是所有异常类的父类,且又分为运行时异常(父类---RuntimeException类)和编译时异常。

规定:编译时异常必须捕获,如果不捕获会导致程序无法编译,也就无法运行了。例如ClassnotfoundExcetion就是编译时异常,参考代码如下:

解决如下:

2.4 try,catch,finally捕获异常

try,catch,finally异常处理

用法1:

try{

}catch(Exception e){

用法2:

try{

}catch(Exception e){

}finally{

用法3:

try{

}finally{

解析:

(1)try中用于包裹住可能发生异常的代码

(2)catch中用于捕获异常,并对异常进行处理

(3)finally中用于回收资源

(4)try与catch组合时,一个try可以与多个catch组合,但是try只能有一个

(5)try与finally组合时,一个try只能与一个finally组合,且try和finally都只能有一个

(6)try不能单独使用,catch不能单独使用,finally不能单独使用,catch和finally不能组合使用

2.5 throw,throws异常处理

2.5.1 throw

用在方法内部,后面紧跟一个异常对象,表示要抛出这个异常

2.5.2 throws

用于定义在方法声明的后面,表示该方法可能会抛出异常,并告诉主调方法需要处理该方法抛出的异常。Throws不能单独写一行代码,后面是抛出异常的类型,可抛出多个异常类型,多个之间用逗号分隔。

  • 用法1:被调方法不处理异常,直接抛给主调方法

public static void main(String[] args){

try{

divide();

}catch(ArithmeticException e){

e.printStackTrace();

}

}

public static void divide() throws ArithmeticException{

System.out.println("start");

int i=1,j=0;

int res=i/j;

System.out.println("over");

}

运行结果:

start

java.lang.ArithmeticException: / by zero

​ at homework01.Test.divide(Test.java:19)

​ at homework01.Test.main(Test.java:10)

分析:

(1)main方法是主调方法

(2)divide是被调方法,被调方法内部发生异常时,被调方法没有处理异常,而是将异常抛给主调方法,由主调方法处理异常。

  • 用法2:被调方法抓住异常后再次抛给主调方法(常用

将除0的错误描述显示为中文

代码:

public static void main(String[] args){

try{

divide();

}catch(ArithmeticException e){

e.printStackTrace();

}

}

public static void divide() throws ArithmeticException{

try{

System.out.println("start");

int i=1,j=0;

int res=i/j;

System.out.println("over");

}catch (Exception e){

ArithmeticException ex=ArithmeticException("除零异常");

throw ex;

}

}

运行结果:

start

java.lang.ArithmeticException: 除零异常

​ at homework01.Test.divide(Test.java:23)

​ at homework01.Test.main(Test.java:10)

分析:

(1)int res=i/j由于j=0,jvm抛出ArithmeticException异常,该异常被catch抓住,所有catch中的e就是i/j时抛出的异常,但是这个异常由于是jvm创建并抛出的,因此是英文提示。

(2)如何改为中文提示。方法是开发人员自定义一个异常对象,在异常对象的构造函数中输入中文异常描述信息,再将这个异常对象使用throw关键字抛出。

(3)在主调方法中捕获的异常就是中文信息。

2.6自定义异常

当JDK中的异常类型不能满足程序的需要时,可以自定义异常类,使用自定义异常类一般有以下几个步骤。

(1)定义异常类,并继承Exception或者RuntimeException。

(2)编写异常类的构造方法,向父类构造方法传入异常描述信息,并继承父类的其他实现方法。

(3)实例化自定义异常对象,并在程序中使用throw抛出。

例如:

lass Person{
private String name ="";
private int age=0;
private String gender="男";

public void setGender(String gender)throws Exception {
    if ("男".equals(gender) || "女".equals(gender)) {
        this.gender=gender;
    }else {
        throw new Exception("性别必须是男或女");
    }
}
public void print() {
    System.out.println("姓名:"+this.name+",性别"+this.gender+",年龄"+this.age);
}

}

public class Demo7 {
public static void main(String[] args) {
Person person = new Person();
try {
person.setName("顾大嫂");
person.setGender("Female");
person.setAge(18);
person.print();
} catch (Exception e) {
e.printStackTrace();
}
}
}

2.7异常相关的方法

getMessage():获取异常描述信息

printStackTrace():输出异常的堆栈信息

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1