一、异常类
异常定义:指运行程序过程中产生的异常情况。
产生异常的原因:
- 用户输入了非法的数据。
- 要打开的文件不存在。
- 网络通信时连接中断
- JVM内存溢出
常见的三种异常:
1.检查性异常:用于表示可恢复的异常(也就是你必须检查的异常);
2.运行时异常:一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。
错误:错误不是异常,而是脱离程序员控制的问题。
在java中所有异常类型都是内置类java.lang.Throwable类的子类。java程序通常不捕获错误。
异常结构图
java内置异常类
Java语言定义了一些异常在Java.lang标准包中。
非检查性异常
异常 | 描述 |
ArithmeticException | 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例 |
ArrayIndexOutOfBoundsException | 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 |
ArrayStoreException | 试图将错误类型的对象存储到一个对象数组时抛出的异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数。 |
IllegalMonitorStateException | 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操作所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 如果应用程序试图创建大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
SecurityException | 由安全管理器抛出的异常,指示存在安全侵犯。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小 |
UnsupportedOperationException | 当不支持请求的操作时,抛出该异常。 |
检查性异常
异常 | 描述 |
ClassNotFoundException | 应用程序试图加载类时,找不到相应的类,抛出该异常。 |
CloneNotSupportedException | 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。 |
IllegalAccessException | 拒绝访问一个类的时候,抛出该异常。 |
InstantiationException | 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。 |
InterruptedException | 一个线程被另一个线程中断,抛出该异常。 |
NoSuchFieldException | 请求的变量不存在 |
NoSuchMethodException | 请求的方法不存在 |
如何捕获异常:
可以使用try或catch来捕获异常。
try{
}
catch(ExceptionName e1){
}
try{
}catch(异常类型1 异常的变量名1){
}catch(异常类型2 异常的变量名2){
}catch(异常类型3 异常的变量名3){
}
try和catch是用于处理异常的语句,它们构成了一种异常处理机制。在一个try语句中,程序执行一段代码,如果发生了异常,则会被捕获,并转到相应的catch语句中进行处理。
实例:
进行error捕获:
public class TestCatchError extends Error{
private static final long serialVersionUID = -351488225420878020L; public TestCatchError(){
super();
}
public TestCatchError(String msg){
super(msg);
}
public static void main(String[] args) {
try {
throw new TestCatchError("test catch error");
} catch (Throwable t) {
System.out.println("step in the catch ~");
t.printstacktrace();
}
}
}
throws/throw:
throws和throw用来处理异常
throw 关键字用于在当前方法中抛出一个异常。
throws 关键字用于在方法声明中指定该方法可能抛出的异常。当方法内部抛出指定类型的异常时,该异常会被传递给调用该方法的代码,并在该代码中处理异常。
二 常用类
包装类、String类、Date类、File类、Java Number&Math类、Java Math类。
1.包装类
所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
包装类 | 基本数据类型 |
---|---|
Boolean | boolean |
Byte | byte |
Short | short |
Integer | int |
Long | long |
Character | char |
Float | float |
Double | double |
Integer 实例:
piblic class Test{
public static void main(String[] args){
Integer a=5;
a=a+5;
Syetem.out.println(x);
}
}
装箱与拆箱:
public class Test{
public static void main(String args[]){
Integer x = 5; // boxes int to an Integer object
x = x + 10; // unboxes the Integer to a int
System.out.println(x);
}
}
运行结果:
15
2.String类
创建字符串最简单的方式:
String str="hello";
还可以用构造函数构建字符串:
String str1= new String("hello");
字符数组
public class StringTest{
public static void main(String args[]){
char[] startArray={'h','e','l','l','o'};
String startString= new String(startArray);
System.out.println(startString);
}
}
3.Date类
(日期类主要包括Date类与Calendar类)
在Java中,日期时间用Java.util.Date来表示,调用默认构造器Date(),将会创建一个当前系统时间Date对象,时间精确到毫秒。
Date类常用方法
在java中,日期时间用java.util.Date来表示,调用默认构造器Data(),将会创建一个当前系统时间的Date对象,时间精确到毫秒。Date类常用方法是:
Date()
分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
boolean after(Date when)
测试此日期是否在指定日期之后。
boolean before(Date when)
测试此日期是否在指定日期之前。
int compareTo(Date anotherDate)
比较两个日期的顺序。
4.File类
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
创建File实例:
如:通过给定的父抽象路径名和子路径名字符串创建一个File实例
File(File parent,String child);
实例(File对象的使用):
import java.io.File;
public class DirList {
public static void main(String args[]) {
String dirname = "/java";
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println( "Directory of " + dirname);
String s[] = f1.list();
for (int i=0; i < s.length; i++) { File f = new File(dirname + "/" + s[i]); if (f.isDirectory()) { System.out.println(s[i] + " is a directory"); } else { System.out.println(s[i] + " is a file"); } } } else { System.out.println(dirname + " is not a directory"); } } }
5.JavaMath类
Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
6.Number & Math 类方法
常用的Number类和Math类方法:
方法 | 描述 |
xxxValue() | 将number对象转换为xxx数据类型的值并返回 |
compareTo() | 将number对象与参数比较。 |
equals() | 判断number对象是否与参数相等 |
toString() | 以字符串形式返回值 |
abs() | 返回参数的绝对值 |
min()/max() | 返回两个参数中的最小值/最大值 |
pow() | 返回第一个参数的第二个参数次方 |
sqrt() | 求参数的算数平方根 |
random() | 返回一个随机数 |
Java中的final用法
final 关键字可以用来修饰引用、方法和类,final 的作用随着所修饰的类型而不同。
-
final 修饰一个引用
- 如果引用是基本数据类型,则该引用为常量,该值无法修改。
- 如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
- 如果引用是类的成员变量,则必须当场赋值,否则编译会报错。
-
final 修饰类中的方法
当使用 final 修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
-
final 修饰类
当用 final 修改类时,该类成为最终类,无法被继承。简称为“断子绝孙类”。比如常用的 String 类就是最终类。
java容器
java容器有:ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、TreeSet、LinkedHashMap、TreeMap、ConcurrentHashMap、Hashtable等等。
java容器类类库的用途是"保存对象"。
1.Collection
一个独立元素的序列,这些元素都服从一条或多条规则。其中List必须按照插入的顺序保存元素、Set不能有重复的元素、Queue按照排队规则来确定对象的产生顺序(通常也是和插入顺序相同)Collection保存单一的元素。
2.Map
一组成对的值键对对象,允许用键来查找值。ArrayList允许我们用数字来查找值,它是将数字和对象联系在一起。而Map允许我们使用一个对象来查找某个对象,它也被称为关联数组。或者叫做字典。
ArrayList(数组结构):
-
优点:get和set调用花费常数时间,也就是查询的速度快
-
缺点:新项的插入和现有项的删除代价昂贵,也就是添加删除的速度慢
LinkedList(链表结构):
-
优点:新项的插入和和现有项的删除开销很小,即添加和删除的速度快
-
缺点:对get和set的调用花费昂贵,不适合做查询
泛型
泛型:泛型是程序设计语言的一种特性。允许程序员在强类型的程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须做出声明。
为什么要使用泛型?
我们在使用ArrayList实现类的时候,如果没有指定泛型,IDEA会给出警告,代码似乎也是可以顺利运行。
泛型有如下优点:
1.可以减少类型转换的次数,代码更加简洁;
2.程序更加健壮:只要编译期没有警告,运行期就不会抛出ClassCastException异常;
3.提高了代码的可读性:编写集合的时候,就限定了集合中能存放的类型。
如何使用泛型?
在代码中,这样使用泛型:
- 一定使用 <>
- 引用的参数类型一定要加
- List<String> list = new List<String>();
- List<String> list = new List<>();
List<String> list = new ArrayList<String>();
// Java 7 及以后的版本中,构造方法中可以省略泛型类型:List<String> list = new ArrayList<>();代码块123
注意:变量声明的类型必须与传递给实际对象的类型保持一致。
泛型方法可以是静态的(get),也可以是非静态的(getInfo)。对于泛型方法而言,其必须要声明类型变量 ,且位于方法修饰符(public、public static)与方法返回值之间。