);
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界");
}
}
原则:
1、如果有for,if等结构体,那么try-catch应该在这个结构体的外部
2、嵌套try-catch尽量的修改成多重try-catch
try {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i+1] / array);
}
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界");
}catch(Exception e) {
System.out.println("程序有异常");
}
System.out.println("程序继续");
(注意:多重catch捕获的时候,捕获的异常类的引用,从小往大来编写)
问题:
try-catch可以搭配使用,try-finally能不能搭配使用,catch-finally能不能搭配使用?
try-finally可以搭配使用,catch-finally不能搭配使用
7、throws:抛出异常(可以抛出多个异常)
在程序出现异常的位置,不对异常继续处理,但是又想让当前这块程序能执行,那么可以把当前位置出现的异常从当前的方法中抛出;或者提供一种思路
throws的位置:方法的结尾
public void method() throws 异常列表
注意:当一场从某个方法中抛出以后,那个方法调用了这个抛出异常的方法,那么异常就引入到哪个方法中去了;而且抛出是可以多层抛出;在层次结构的抛出中抛出的的异常可以越来越抽象
问题:
方法重载和重写对抛出异常有没有什么限制?
8、throw 自定义异常
系统异常无法满足要求的时候,可以定义新的异常,这个异常要按照异常的层次结构来定义
步骤:
1、自定义异常类:
public class LoginFailException extends Exception {
public LoginFailException(String message) {
super(message);
}
}
2、在合适位置生成异常类对象
public class UserDAOImpl implements UserDAO{
@Override
public void findByUnameAndPwd(String uname, String upwd) throws LoginFailException {
// TODO Auto-generated method stub
if ("admin".equals(uname)&&"123123".equals(upwd)) {
}else {
//生成自定义异常
throw new LoginFailException("登陆失败,用户名或者密码错误!");
}
}
}
3、在合适的位置处理异常
public static void main(String[] args) {
UserDAO userDAO = new UserDAOImpl();
try {
userDAO.findByUnameAndPwd("admin", "123123");
System.out.println("登陆成功");
} catch (LoginFailException e) {
System.out.println(e.getMessage());
}
}
1、java中的常用类
(1)常用类所在的包:
(a)java.lang包:默认包,系统自动导入(此包以外的在别的包下的资源,使用前都需要导入)
(b)java.util包:工具包,提供了很多的工具类
(c)java.text包:格式化,提供了格式化数据的工具
(d)java.sql包:jdbc操作,提供了jdbc操作的接口
(e)java.io包:输入输出,提供数据的写入写出操作工具
(f)java.net包:网络开发,提供了网络编程的一些工具
(2)常用类:
Java.lang包:
(1)包装类:把基本数据类型转换成对象,可以使用对象中提供的更丰富的功能
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
(注:包装类用的最多的地方就是字符串转换成各种数据类型)
(2)String类:字符串类,提供了很多关于字符串的操作
a)String怎么实例化的
(1)String s = "字符串";
(2)String s = new String(“字符串”);
问题:
以下的两种方式分别创建了多少个对象?
String s = "abc";
String s1 = new String(“abc”);
String s2 = new String(“abc”);
以上一共创建了:3个
以上两种有什么区别?
String s = "abc";在创建对象的过程中使用的是字符串池保持数据
String s1 = new String()创建对象是使用堆栈来保持数据
那么:
String s1 = “wangwei”
String s2 = “wangwei”
创建了几个对象?1个
所以在开发的时候应该用第一种方式创建字符串,这样可以更节省内存空间
b)String的不变性
问题:
String s = “abc”;
s = s +”efg”;
创建几个对象?2个
什么叫字符串的不变性:当字符串的内容发生变化的时候总是会新创建一个字符串
1、集合类:和数组类似用于存储多个数据一种容器
(1)集合类和数组的区别?
(a)数组在存储数据前必须要先确定数组长度
(b)一个数组中存储的数据的数据类型是统一的
(2)集合的层次结构
Iterable接口(提供所有底层迭代的方法)
-->Collection接口(提供所有集合的CRUD等操作的规范)
-->List接口(提供List接口下实现类的CRUD等操作的规范)
-->ArrayList、LinkedList、Vector
-->Set接口(提供Set接口下实现类的CRUD等操作的规范)
-->HashSet、TreeSet
Map接口(提供看key-value方式集合的CRUD操作规范)
-->HashMap、HashTable
问题:
1、Collection接口下的集合类和Map接口下的实现的区别?
Collection接口下的集合类中存储的元素是以元素所在集合中的位置来定位和操作的
Map接口下集合类中存储的元素是以key值最为标志来定位和操作的
2、List接口下的实现类和Set接口下的实现类有什么区别?
区别1:
(1)List接口下的实现类存储的元素在集合中位置是不会发生变化
(2)Set接口下的实现类在存储数据的时候会有一套排序机制对存储的位置进行修改
区别2:
List接口下的实现类可以存储重复对象;Set接口下的实现类不能存重复对象
3、Map集合存储的数据的特点?
存储数据的时候是key-value都要保存;取值的时候是利用key来获取value;如果需要便利的时候,需要使用values()方法取出所有的value值后再遍历;在存储数据的时候会有一套排序机制对存储的位置进行修改
4、ArrayList和LinkedList有什么区别?
ArrayList在存储数据的时候是利用数组的方式来存储数据;利用下标来标识每个元素在集合中的位置
LinkedList在存储数据的时候是利用链表的方式来存储数据;每个元素没有下标,利用收尾相连的方式确定元素在集合中的位置
ArrayList和LinkedList存储效率差异:
ArrayList在查询的时候效率高;添加和删除的时候LinkedList效率更高
5、ArrayList和Vector有什么区别?
ArrayList:数据操作是不同步的;线程不同步;一个线程操作集合的时候其他线程可以进行操作; 数据相对不安全,但是效率会比较高
Vector:数据操作是同步的;线程同步;一个线程操作集合的时候其他线程无法进行操作; 数据相对安全,但是效率会比较低
6、集合加泛型和不加泛型有什么区别?
集合加泛型也就是规定了集合的存储的数据类型;但规定了数据类型后就是取值的时候不需要考虑数据类型转换的问题; 集合不加泛型没规定集合中存储数据的类型,集合可以存储所有的数据类型,问题是取值的时候无法确定统一的数据类型
6_1、集合的装箱(向上转型)和拆箱操作(向下转型)?
在不加泛型的集合中,所有的数据在存储到集合之前会自动向上转型成Object对象再进行保存;在取出数据的时候需要手动的强制类型转换成原来存储时的数据类型
7、Collection和Collections有什么区别?
Collection是集合的顶层接口提供了集合操作的规范;
Collections是一个集合的工具类,提供了大量的static方法来对集合进行操作(排序、反转、比较....),这些方法大部分的返回值也是集合类型
(3)集合的操作:
CRUD(增、删、改、查)
ArrayList:add()、clear()、remove()、get()、set()、size()、普通for循环遍历、foreach遍历、迭代器遍历
HashSet:add()、clear()、remove()、size()、没有提供查某个和修改方法、foreach遍历、迭代器遍历
HashMap:put()、clear()、remove()、修改方法也是put()、get()、size()、普通for循环遍历、foreach遍历、迭代器遍历
c)解决字符串不变性的方法
如果要对一个字符串进行频繁的修改操作,那么不要直接使用String类型来操作,而可以使用StringBuffer来操作
StringBuffer的实例化:
StringBuffer strbuf = new StringBuffer(“待操作的字符串”)
利用StringBuffer提供的方法对字符串进行操作:
append():追加
charAt():返回字符串中某个下标对应的字符
delete():删除字符串中的内容
Insert():在字符串中插入新内容
replace():替换字符串中内容
reverse():反转字符串内容
subString():切割字符串内容
(3) Math类:数学类,提供很多数据计算的方法
该类下所有的属性和方法都是static的,可以直接使用Math.调用,不需要实例化Math对象
常用的方法:
abs():绝对值
floor():取出比当前浮点数小的最大整数
ceil():取出比当前浮点数大的最小整数
round():四舍五入取整
random():0~1的随机数
max():最大数
min():最小数
练习:生成(1000~10000之间的随机数)
java.util包
(1)Random类:随机数类,提供了生成随机数的各种方法
(2)集合类:用来存储多条数据的工具类