一、异常机制:
1、异常:JAVA 提供的用于处理程序中错误的一种机制
2、异常分类:
编译时异常:如果程序一旦出现检查时异常,程序必须要经过处理,否则无法运行
运行时异常:推荐增强程序的健壮性就可以处理
一般运行时异常都会直接或者间接的继承自RuntimeException
Error:这类错误不需要程序员管理
Exception:所有异常的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示地声明或捕获。
Throwable类
/ \
Error Exception
| | \
Unchecked Checked Runtime
Exception Exception Exception
3、运行时异常: RuntimeException
运行时异常假如不抛出,或者抛出但不处理,不报错,但运行时会异常终止。
空指针 NullPointerException
数组越界异常 ArrayIndexOutOfBoundsException
负数异常|数组的长度为负数异常 NegativeArraySizeException
数学异常 ArithmeticException
类型转换异常 ClassCastException
数字转换异常 NumberFormatException
public classExceptionDemo {
public static voidmain(String[] args) {
//1.空指针 NullPointerException
String s=null;
s.length();
//增强程序的健壮性
if(s!=null){
s.length();
}else{
System.out.println("s是空的");
}
//2.数组越界 ArrayIndexOutOfBoundsException
int[] arr=new int[3];
System.out.println(arr[3]);
//3.负数异常 NegativeArraySizeException
int[] arr2=new int[-3];
//4.数学异常|分母为0异常
System.out.println(2/0);
//5.类型转换异常ClassCastException
Person p =new Student();
Teacher t=(Teacher)p;
//6.数字转换异常NumberFormatException
Strings2="123abc";
System.out.println(Integer.valueOf(s));
}
}
class Person{}
class Student extendsPerson{}
class Teacher extends Person{}
4、编译时异常:
InputStream
is=new FileInputStream("D://test.txt");//D盘中并无此文件时
5、异常处理和捕获
编译时异常必须处理或者抛出再处理,否则无法通过编译。
5.1、throws 抛出异常
如throws Exception,将异常抛出到外面一层去,然后在外层处理
方法的重写 : 子类重写方法抛出异常<=父类方法抛出的异常
制造异常:使用throw
5.2、try..catch..fanally捕获和处理异常
try {
可能会出现异常的代码;
} catch
(FileNotFoundException e) {
如果出现对应的异常执行的代码
} catch
(NullPointerException e){
} catch
(Exception e){
} finally{
无论是否出现异常,一定会执行的代码
}
注意:
如果try中的代码出现异常,下面的代码不会执行,直接执行对应的catch中的代码
一个try至少存在一个或者多个catch
catch中捕获异常的顺序从小到大写
通常在finally语句中可以进行资源的清除工作,如:关闭打开的文件、删除临时文件
6、自定义异常类: 要直接或者间接继承自Exception或者它的子类
年龄不合法的情况:
public classExceptionDemo {
public static voidmain(String[] args) {
//自定义异常
User user=new User();
try {
user.setAge(-18);
} catch(AgeException e) {
e.printStackTrace();
} System.out.println("18岁");
}
}
classAgeException extends Exception{
publicAgeException() { }
public AgeException(String message) {
super(message+"年龄异常");
}
}
class User{
private int age;
public intgetAge() {
return age;
}
public void setAge(int age)throws AgeException {
if(age<0) {
throw new AgeException();
}else {
this.age = age;
}
}
}
常用类:学习类的API
二、String 相关类
作用:String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
String不可变长字符串|字符序列
StringBuilder:可变长字符串 ,线程不安全,效率较高
StringBuffer:可变长字符串 ,线程安全的,效率较低
1、常用构造方法
String str1="abc";
String str2="abc";
//一个对象,“abc”在常量池中
System.out.println(str1==str2);//true
//空构造器String str3=new String();
//String(String original)
String str4=new String("hehe");
//String(char[] value)
String str5=newString(new char[]{'a','b','c','d'});
//String(char[] value, int offset, intcount)
String str6=new String(newchar[]{'a','b','c','d'},1,2);
System.out.println(str6);//bc
System.out.println(new String(new char[]{22222,'2'}));
//构建字符串//String(byte[] bytes)
//通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String str7=new String(new byte[]{66,67,68});
//String(byte[]bytes, int offset, int length)
//通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
String str8=new String(new byte[]{66,67,68},1,2);
String str9="qwer";
byte[] by=str9.getBytes();
System.out.println(Arrays.toString(by));
2、String 类常用方法:
Stringstr1="good good study";
String str2=" day day up ";
//1.char charAt(int index) 返回指定索引处的 char 值。
System.out.println("charAt():"+str1.charAt(3)); //d
//2.intcodePointAt(int index) 返回指定索引处的字符(Unicode 代码点)。System.out.println("codePointAt():"+str1.codePointAt(3)); //100
//3.int compareTo(String anotherString)按字典顺序比较两个字符串。
//相等为0 ,如果this比参数对象大返回整数,否则返回负数System.out.println("compareTo():"+str1.compareTo(str2)); //3
//4.compareToIgnoreCase(String str)按字典顺序比较两个字符串,不考虑大小写System.out.println("abc".compareToIgnoreCase("AbcDEFgh")); //-5
//5.String concat(String str) 将指定字符串连接到此字符串的结。
System.out.println("concat():"+str1.concat("!")); //good good study!
//6.booleancontains(CharSequence s)
//当且仅当此字符串包含指定的 char 值序列时,返回 true。
System.out.println("contains():"+str1.contains("oo")); //true
//7.static String copyValueOf(char[]data)
//返回指定数组中表示该字符序列的 String。
System.out.println(String.copyValueOf(new char[]{'a','b','c'})); //abc System.out.println(String.copyValueOf(newchar[]{'a','b','c'},1,2)); //bc
//8.boolean endsWith(String suffix) //测试此字符串是否以指定的后缀结束。 System.out.println("endsWith():"+str.endsWith("y")); //true
//9.boolean startsWith(Stringprefix) //测试此字符串是否以指定的前缀开始。System.out.println("startsWith():"+str.startsWith("good")); //true
//10.byte[] getBytes()字符串转字节数组System.out.println("getBytes():"+Arrays.toString(str1.getBytes()));
//[103, 111, 111, 100, 32, 103, 111, 111,100, 32, 115, 116, 117, 100, 121]
//11.int indexOf(String str) //返回指定子字符串在此字符串中第一次出现处的索引 System.out.println("indexOf():"+str1.indexOf("o")); //1
System.out.println("lastIndexOf():"+str1.lastIndexOf("o")); //7
//12.String replace(char oldChar, char newChar)
//返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。System.out.println("replace():"+str1.replace("oo","OO")); //replace():gOOd gOOd study
//13.String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。
System.out.println(str1);//good good study String[]arr=str1.split(" "); System.out.println(Arrays.toString(arr));//[good,good, study]
System.out.println(arr[1]);//good
//14.String substring(intbeginIndex) //返回一个新的字符串,它是此字符串的一个子字符串。
//15.String substring(int beginIndex, int endIndex)
//返回一个新字符串,它是此字符串的一个子字符串。结束位置索引获取不到System.out.println("substring():"+str1.substring(5)); //substring():good study System.out.println("substring():"+str1.substring(5,8)); //substring():goo
//16.char[] toCharArray()将此字符串转换为一个新的字符数组。
System.out.println(str1.toCharArray()); //good good study
//17.String toLowerCase()
//18.String toUpperCase() System.out.println(str1.toUpperCase()); //GOOD GOOD STUDY
//使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
//19.String trim()返回字符串的副本,忽略前导空白和尾部空白。
System.out.println("trim():"+str2.trim()); //trim():day day up
//20.static StringvalueOf(int i) 返回 int 参数的字符串表示形 System.out.println("valueOf():"+String.valueOf(1234)); //1234
3、StringBuffer和Stringbuilder
StringBuilder()构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。
StringBuilder:
str=new StringBuilder();
System.out.println(str);
str.append("qwert");
System.out.println(str);
System.out.println(str.capacity());
System.out.println(str.length());
//StringBuilder(int capacity)构造一个其中不带字符的字符串生成器,初始容量由capacity 参数指定。
str=new StringBuilder(10);
System.out.println(str.capacity());
//StringBuilder(String str)构造一个字符串生成器,并初始化为指定的字符串内容。
str=new StringBuilder("abc");
str.append(121);
System.out.println(str);
//StringBuilder delete(int start, intend)
str.delete(3, 5);System.out.println(str);
//StringBuilder insert(int offset, boolean b)
str.insert(3, false);
System.out.println(str);
//StringBuilder reverse()
str.reverse(); system.out.println(str);
4、String与StringBuilder之间相互转换
String->StringBuilder 构造器
String(StringBuffer buffer)分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。StringBuilder->String 构造器
String(StringBuilder builder)
三、包装类
包装类顾名思义就是将基本的数据类型以及一些辅助方法包装到类中
基本数据类型 包装类
byte --- Byte
short --- Short
int --- Integer
long --- Long
char --- Character
float --- Float
double --- Double
boolean --- Boolean
自动装箱:基本数据类型-->包装类型
自动拆箱:包装类型-->基本数据类型
int a=5;Integer i1=a; //自动装箱 Integer i1=Integer.valueOf(a);
int int1=i1; //自动拆箱 int int1=i1.intvalue()
四、 Math数学类
//static double Math.ceil(double a) 向上取整
System.out.println(Math.ceil(-3.3)); //-3.0
//static double floor(double a) 向下取整
System.out.println(Math.floor(-3.3)); //-4.0
//static long max(long a, long b) //返回两个long 值中较大的一个。
//static double min(double a, double b)
//返回两个double 值中较小的一个。
System.out.println(Math.max(5, 7));
五、日期类Date
1、构造器:
Date() 以当前系统时间构建日期对象
Date(long date) 参数为毫秒数,默认从1970.1.1.0.0.0开始计算
注意:导包 java.util.Date
//日期对象转为字符串 Date date=new Date(); String s=date.toString();
System.out.println(s); System.out.println(s.length());
2、SimpleDateFormat 日期格式类|转换类|转换器 指定格式
y->年 M->月 d->日 H->24小时 h->12小时 m->分 s->秒 S->毫秒
format(Date)-->日期对象转为字符串,可以按照指定格式,可以使用转换器的默认格式
parse(String) -->把字符串转为日期对象,按照指定格式转换
SimpleDateFormat
format=new SimpleDateFormat();
System.out.println(format.format(date));//19-5-6下午8:35
SimpleDateFormat formatNew=newSimpleDateFormat("yyyy年MM月DD日 E a hh:mm:ss SS");
System.out.println(formatNew.format(date)); //2019年05月126日 星期一下午08:35:57 572 Stringstr="2019/05/126/ 08:44:59 515";
System.out.println(formatNew.parse(str));
六、总结与注意点
1、编译器的优化问题
编译器将源代码编译为字节码时,会进行相应的优化操作
1.1对常量的操作
已经计算过的表达式
常量表达式
常量替换
确定的计算结果
1.2数组边界检查消除
如果可以确定不越界,编译器会把多余的数组越界检查消除掉
2、对比三种方式:
让我们得到的对象或参数类型,按照要求转成字符串的形式。
String:强转,简单方便但如果要转的不是字符串的话,那么就会报错。
toString():一般的对象或者参数都是有toString()的方法的,只是要注意在一个参数定义为int类型是就没有这个方法了。还有就是当参数为空的时候.toString()方法就会报出空指针异常
String.valueOf(123):这个方法是静态的,直接通过String调用,这样的实现避免了前面两个的不足和缺点。内部的实现机制:
public static String
valueOf(Object obj){return (obj==null) ? "null" : obj.toString()};
在内部就是做了为空的判断的,所以就不会报出空指针异常。
3、注意使用new创建字符串对象时的区别
//以下步骤创建了几个对象???
String sss1=newString("haha"); //2个 "haha"-->字符串常量池里面 new->堆中
String sss2=new String("haha"); //1个 new->堆中Stringsss3="haha"; //没有
System.out.println(sss1==sss2);
System.out.println(sss1.equals(sss2));
System.out.println(sss2==sss3); //false
String sss4="a"+"b"+"c"+"d"; //"abcd"