Throwable java
|---Error //一般出现重大问题如:运行的类不存在或者内存溢出等。 正则表达式
|---Exception //运行时出现的一块儿状况 shell
|---RuntimeException //特殊异常类,抛时不须要声明 数据库
Exception和Error的子类名都是以父类名做为后缀。 编程
异常体系的特色: 设计模式
1)异常体系中的全部类以及创建的对象都具有可抛性。 数组
2)也就是说能够被throw和throws关键字所操做。 安全
1)编译时被检测异常: 网络
该异常在编译时,若是没有处理(没有抛也没有try),编译失败。该异常被标识,表明着能够被处理。 多线程
2)运行时异常(编译时不检测):
在编译时,不须要处理,编译器不检查。该异常的发生,建议不处理,让程序中止,须要对代码进行修正例如:RuntimeException以及其子类。
四、throw和throws
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,能够抛出多个用逗号隔开。
当函数内容有throw抛出异常对象,并未进行try处理。必需要在函数上声明,不然编译失败。
Note:throws 和 throw 的区别:
throws 使用在函数上(写在小括号和大括号之间)。throw 使用在函数内。
throws 后面跟的异常类。能够跟多个。用逗号隔开。throw 后跟的是异常对象。
常见方法操做:
String getMessage();//获取异常的信息。返回字符串。
toString();//获取异常类名和异常信息,返回字符串。
printStackTrace(); //获取异常类名和异常信息,以及异常出如今程序中的位置.返回值void.
//其实JVM默认的异常处理机制,就是在调用printStackTrace方法,打印异常的堆栈的跟踪信息。
3) 当自定义了异常类继承Exception后,若是未在类中定义异常信息,那么经过toString方法打印出来的结果就只有自定义的异常类名,不会显示异常信息。
4) 要定义自定义异常的信息时,可使用父类已经定义好的功能。异常信息传递给父类的构造函数。由于父类中已经把异常信息的操做都完成了。因此子类只要在构造时,将异常信息传递给父类经过super语句。那么就能够直接经过getMessage方法获取自定义的异常信息。
class MyException extends Exception { private String msg; MyException(String msg) { super(msg);// 返回自定义的输入信息 } }六、异常的好处:
/* 老师使用电脑讲课。 描述电脑: 一、电脑运行 二、电脑重启 描述电脑问题: 一、电脑蓝屏了 二、电脑起火了 描述老师: 一、老师使用电脑 二、老师讲课。 描述老师可能出现的问题: 一、老师不能继续讲课了,他让同窗们本身作练习。 */ //电脑蓝屏了 class BlueScreenException extends Exception { BlueScreenException(String message) { super(message); } } //电脑起火了 class FireBreakingException extends Exception { FireBreakingException(String message) { super(message); } } //老师没法继续上课 class StopTeachException extends Exception { StopTeachException(String message) { super(message); } } class Computer { int start=1; //电脑启动 void run()throws BlueScreenException,FireBreakingException { if(start==2) throw new BlueScreenException("Computer_BlueScreen"); else if(start==3) throw new FireBreakingException("Computer_FireBreaking"); System.out.println("Computer_run"); } //电脑重启 void reset() { start=1; System.out.println("Computer_reset"); } } class Teacher { private String name; private Computer cpt; //对老师进行初始化 Teacher(String name) { this.name=name; cpt=new Computer(); } //老师开始讲课 public void teach()throws StopTeachException { try { cpt.run(); } catch (BlueScreenException e) { //System.out.println(e.getMessage()); cpt.reset(); } catch (FireBreakingException e) { test(); //System.out.println(e.getMessage()); throw new StopTeachException("Teather_StopTeach:"+e.getMessage()); } System.out.println(name+"Teacher_teaching"); } void test() { System.out.println("学生作练习"); } } class ExceptionTest { public static void main(String[] args) { Teacher t=new Teacher("毕老师"); try { t.teach(); } catch (StopTeachException e) { System.out.println(e.toString()); System.out.println("换老师或者放假"); } } }2、经常使用类
1)获取
1.1字符串中包含的字符数,也就是字符串的长度
int length()://获取长度。
1.2根据位置获取位置上的某个字符
char charAt(int index)://当访问到字符串中不存在的角标时,会发生字符串角标越界的错误。
1.3根据字符获取该字符存在字符串的位置
int indexOf(int ch)://返回的是ch在字符串中第一次出现的位置。//传入的是字符对应的ASCII码。//若是没有找到,返回-1。
int indexOf(int ch,int fromIndex)://从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(String str)://返回的是str在字符串中第一次出现的位置。
int indexOf(String str,int fromIndex)://从fromIndex指定位置开始,获取str在字符串中出现的位置。
int lastIndexOf()://反向索引
2)判断
2.1字符串中是否包含某一个子串
boolean contains(str);
Note:indexOf(str)能够索引str第一次出现的位置,若是返回-1表示该str不在字符串中存在。因此,也能够用于对指定判断是否包。 如:if(str.indexOf(“aa”)!=-1)并且该方法既能够判断,又能够获取出现的位置。若是只为判断,用contains。
2.2字符串中是否有内容
boolean isEmpty();//原理就是判断长度是否为0。
2.3字符串是不是以指定内容开头
boolean startsWith(str);
2.4字符串是不是以指定内容结尾
boolean endsWith(str);
2.5判断字符串内容是否相同,复写了Object类中的equals方法
boolean equals(str);
2.6判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase();
3)转换
3.1将字符数组转成字符串
构造方法:String(char[]);
String(char[],offset,count);//将字符数组中的一部分转成字符串。
静态方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data,int offset ,int count );
static String valueOf(char[]);
3.2将字符串转成字符数组
char[] toCharArray();
3.3将字节数组转成字符串
String(byte[]);
String(byte[],offset,count);//将字节数组中的一部分转成字符串。count表示个数。
3.4将字符串转成字节数组
byte[] getBytes();
3.5将基本数据类型转成字符串
String valueOf(int);
String valueOf(double);
Note:字符串和字节数组在转换过程当中,是能够指定编码表的。
4)替换
String replace(oldchar,newchar);//返回的是一个新字符串。若是要替换的字符不存在,返回的仍是原字符串。
5)切割
String[] split(regex);//涉及到正则表达式的点,不能做为切割字符串的regex。
6)子串,获取字符串中的一部分
String substring(begin);//从指定位置开始到结尾。若是角标不存在,会出现字符串角标越界异常。
String substring(begin,end);//包含头,不包含尾。
7)转换,去除空格,比较
7.1将字符串转成大写或小写
String toUpperCase();
String toLowerCase();
7.2将字符串两端的多个空格去除
String trim();
7.3对两个字符串进行天然顺序的比较
int compareTo(String);
基于上述知识点,几个小练习演示以下所示:/* * 练习:一、字符串反转 * 二、获取一个字符串在另外一个字符串中出现的次数 * 三、有两个字符串,找出两个字符串中最大相同那个字符串 */ public class StringTest { // 一、字符串反转 public static String reverseString(String str) { char[] ar = str.toCharArray();// 将字符串转成字符数组 reverse(ar);// 将字符数组进行反转 return new String(ar);// 返回反转后的字符串 } // 逐个调换字符数组中的对应位置的字符 public static void reverse(char[] ar) { for (int i = 0, j = ar.length - 1; i < j; i++, j--) { swap(ar, i, j); } } // 自定义反转数组中的两个元素 private static void swap(char[] ar, int i, int j) { char temp = ar[i]; ar[i] = ar[j]; ar[j] = temp; } // 二、获取一个字符串在另外一个字符串中出现的次数 public static int getNumOfString(String str, String key) { int num = 0;// 定义计数器 int index = 0;// 定义脚标,用于记录查询位置 while ((index = str.indexOf(key, index)) != -1) { // indexOf(key) 或者indexOf(key,beginIndex)均可以 // str = str.substring(index + key.length()); index = index + key.length();// 下一次的查询其实位置是前一次查询返回值加上字符串长度,以此保证每次都是日后偏移查询 num++;// 查到一次,计数器自增1 } return num; } // 三、有两个字符串,找出两个字符串中最大相同那个字符串 public static String getMaxSubString(String str1, String str2) { // 不论传进来的两个字符串谁更长,自定义maxString、minString来指向长字符串和短字符串 String maxString = str1.length() > str2.length() ? str1 : str2; String minString = maxString == str1 ? str2 : str1; String maxSubString = null; for (int i = 0; i < minString.length(); i++) {// 控制在最短字串长度内 // 依次递减短字符串子串 for (int j = 0, k = minString.length() - i; k <= minString.length(); j++, k++) { maxSubString = minString.substring(j, k);// 获取短字符串的子串 if (maxString.indexOf(maxSubString) != -1) {// 若是包含在长字符串中则代表找到了 return maxSubString; } } } return "-1"; } public static void main(String[] args) { String str = "abc cde"; String s1 = "ascasfhelloasfasf v"; String s2 = "ashellolkkd"; System.out.println(reverseString(str)); System.out.println(getNumOfString(str, "c")); System.out.println(getMaxSubString(s2, s1)); } }结果以下所示:
常见操做:
1)存储
StringBuffer append():将指定数据做为参数添加到已有数据的结尾处。
StringBuffer insert(intoffset ,数据):能够将数据插入到指定offset位置。
2)删除
StringBufferedelete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer deleteCharAt(index):删除指定位置的字符。//清空缓冲区:对象.delete(0,对象.length());
3)获取
char charAt(int index);
int indexOf(String str);
int lastIndexOf(String str);
int length();
String substring(int start,int end);
4)修改
StringBuffer replace(int start,int end,String str);
void setCharAt(int index,char ch);
5)反转
StringBuffer reverse();
6)将缓冲区中指定数据存储到指定字符数组中
voidgetChars(int srcBegin, int srcEnd,char[] dst,int dstBegin)
四、StringBuilder类
概述:StringBuilder在JDK1.5 版本以后出现的,一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用做 StringBuffer 的一个简易替换, 用在字符串缓冲区被单个线程使用的时候(这种状况很广泛)。若是可能,简易优先采用 StringBuilder 类,由于此类比 StringBuffer 效率高。
StringBuilder 和 StringBuffer 的功能是同样的,可是有区别:
StringBuffer(JDK1.0)是线程安全的。通常用于多线程。
StringBuilder(JDK1.5)不保证线程安全。通常用于单线程。
Note:通常来讲,咱们写的程序都是单线程的,因此,用 StringBuilde,效率高,之后开发建议使用 StringBuilder。
import java.text.SimpleDateFormat; import java.util.Date; /* * Date类: * 一、获取系统当前时间 * 二、利用SimpleDateFormat类格式化指定时间 */ public class DateDemo { public static void main(String[] args) { // 第一种获取方式 Date date1 = new Date(); // 第二种获取方式 long time = System.currentTimeMillis(); Date date2 = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); String needDate = sdf.format(date2); System.out.println("系统时间戳:" + date2); System.out.println("格式化时间:" + needDate); System.out.println("格式化模板:" + sdf.toPattern()); } }结果以下:
import java.util.Calendar; /* * Calendar类: * set() 给指定日历设置给定值 * get() 获取指定字段 * * add() 在指定时间上加上一个指定的值再显示 */ public class CalendarDemo { public static void main(String[] args) { // 获取某年2月的天数,例如2012年的2月有几天 Calendar c = Calendar.getInstance(); // 3月1日减一天就是2月的最后一天,Calendar月份范围0-11 c.set(2012, 2, 1); c.add(Calendar.DAY_OF_MONTH, -1); System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月共有" + c.get(Calendar.DAY_OF_MONTH)); // 日历设置到2个月后 c.add(Calendar.MONTH, 2); System.out.println("日历设置到2个月后是" + c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DAY_OF_MONTH) + "日"); } }结果以下:
/* GUI:文本框和文本区域功能等(对话框) */ import java.awt.*; import java.awt.event.*; import java.io.*; public class MyWindowDemo { private Frame f; private TextField tf; private Button but; private TextArea ta; private Dialog d; private Label lab; private Button okBut; MyWindowDemo() { init(); } public void init() { f = new Frame("my window"); f.setBounds(300, 100, 600, 500); f.setLayout(new FlowLayout()); tf = new TextField(60); but = new Button("转到"); ta = new TextArea(25, 70); // 此处不该该直接初始化对话框等组件,通常处理用户出错问题再建立使用对话框 // 这里只为演示看效果。 d = new Dialog(f, "提示信息-self", true); d.setBounds(400, 200, 240, 150); d.setLayout(new FlowLayout()); lab = new Label(); okBut = new Button("肯定"); d.add(lab); d.add(okBut); // 注意:不要将对话框添加到frame中,只有出现问题才会调用出现对话框 f.add(tf); f.add(but); f.add(ta); myEvent(); f.setVisible(true); } private void myEvent() { okBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { d.setVisible(false); } }); d.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { d.setVisible(false); } }); tf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) showDir(); } }); but.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showDir(); } }); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } private void showDir() { String dirPath = tf.getText(); File dir = new File(dirPath); if (dir.exists() && dir.isDirectory()) { ta.setText("");// 清空文本 String[] names = dir.list(); for (String name : names) { ta.append(name + "\r\n");// 追加文本 } } else { String info = "您输入的信息:" + dirPath + "是错误的。请重输"; lab.setText(info); d.setVisible(true); } } public static void main(String[] args) { new MyWindowDemo(); } }结果以下:
import java.util.regex.Matcher; import java.util.regex.Pattern; /* * 正则表达式: * 做用:用于操做字符串 * 特色:用于一些特定的字符串来表达一些代码操做---到达简化效果 * 好处:能够简化对字符串的校验操做 * 弊端:符号定义越多,正则越长,阅读性极差 * * 具体操做功能: * 一、匹配:String matches(regex) * 二、切割:String[] split(String regex) * 三、替换:String replaceAll(String regex, String replacement) * 四、获取:将字符串中符合规则的子串取出 * 操做步骤: * 1)将正则表达式封装成对象 * 2)让正则对象和药操做的字符串相关联 * 3)获取正则匹配引擎 * 4)经过引擎对符合规则的子串进行取出 * * */ public class RegexDemo { public static void main(String[] args) { System.out.println("---------checkQQ-----------"); checkQQ(); System.out.println("---------regexDemo1-----------"); regexDemo1(); System.out.println("---------checkPhonenum-----------"); checkPhonenum(); System.out.println("---------splitDemo-----------"); splitDemo(); System.out.println("---------replaceAllDemo-----------"); replaceAllDemo(); System.out.println("---------getDemo-----------"); getDemo(); } // 获取 public static void getDemo() { String str = "zhong guan cong hei ma di shi er qi jiu yao kai ban le."; System.out.println("字符串:" + str); String regex = "\\b[a-z]{4}\\b"; // 将规则封装成对象 Pattern p = Pattern.compile(regex); // 让正则对象和要做用的字符串相关联,获取匹配器对象 Matcher m = p.matcher(str); // String类中的matches()用的就是Pattern和Matcher对象来完成的,仅仅为了使用简单而封装的,功能单一 // 将规则做用到字符串上,并进行符合规则的子串查找 // boolean flag = m.find(); // System.out.println(flag); // System.out.println(m.group());// 用于获取匹配后的结果 System.out.println("获取结果为:"); while (m.find()) { System.out.println(m.group()); System.out.println(m.start() + "..." + m.end()); } } // 替换 public static void replaceAllDemo() { String str = "wwwwwwwitheimaaaaacom"; // 用“#”替换数字 // String repstr = str.replaceAll("\\d{5,}", "#"); // 将叠词替换& // String repstr = str.replaceAll("(.)\\1+", "&"); // 将重叠的字母替换成单个字母,用$n(n为前面的组标识)获取前面的组 String repstr = str.replaceAll("(.)\\1+", "$1"); System.out.println("字符串:" + str + "替换后结果为:" + repstr); } // 切割 public static void splitDemo() { String str = "wwwkkitheimaqqcom"; // str = "d:\\abc\\a.txt"; // .表明任何字符(与行结束符可能匹配也可能不匹配)要使用必须转义 \\. // String regex = "\\."; // 路径分隔符\\对应的regex为\\\\ // String regex = "\\\\"; // 按照叠词切割. // 为了让规则的结果被重用,能够讲规则封装成一个组,用()完成。 // 组的出现都有编号,从1开始,要想使用就能够经过\n(n为租的编号)表示 String regex = "(.)\\1+"; String[] arr = str.split(regex); System.out.println("切割结果以下:"); for (String ar : arr) { System.out.println(ar); } } // 匹配测试1 public static void regexDemo1() { String str = "a111111"; String regex = "[a-z]\\d{3,5}"; System.out.println("匹配测试1" + str.matches(regex)); } // 匹配手机号:手机号段 13xxx 15xxx 18xxx public static void checkPhonenum() { String phone = "18767330882"; String regex = "1[358]\\d{9}"; boolean flag = phone.matches(regex); if (flag) { System.out.println("验证手机号" + phone + "---is ok"); } else { System.out.println("验证手机号" + phone + "---is wrrong"); } } // 验证QQ号,不能0开头,5-15位,不能有字符 public static void checkQQ() { String qq = "1512465"; String regex = "[1-9]\\d{4,14}"; boolean flag = qq.matches(regex); if (flag) { System.out.println("验证QQ号" + qq + "---is ok"); } else { System.out.println("验证QQ号" + qq + "---is wrrong"); } } }结果如图所示:
import java.util.Collections; import java.util.TreeSet; /* * 功能选择: * 一、只想知道是否正确————>匹配 * 二、想要将已有的字符串便称另外一个字符串————>替换 * 三、想要按照本身的规则将字符串变成多个子串————>切割 * 四、想要拿到符合需求的字符串子串————>获取 */ public class RegexTest { public static void main(String[] args) { System.out.println("----------regexTest1----------"); regexTest1(); System.out.println("----------ipSort----------"); ipSort(); System.out.println("----------checkMail----------"); checkMail(); } // 对邮件地址进行验证。 public static void checkMail() { String mail = "cavenzzep@163.com.cn"; String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"; System.out.println(mail.matches(regex)); } // * 练习需求: 将下面的字符串转换成(我要进黑马) public static void regexTest1() { String str = "我我...我我...我要...要要要...要去...去去去...去北京...京京京"; // 将已有的字符串变成另外一个字符串————>替换 // 一、先将.去掉 // 二、将重复的内容变成单个子符内容 str = str.replaceAll("\\.+", ""); System.out.println(str); str = str.replaceAll("(.)\\1+", "$1"); System.out.println(str); } // 将ip地址进行地址段顺序排序 public static void ipSort() { String ip = "192.168.0.1 2.2.2.1 168.192.10.10 10.10.10.10 254.254.254.1 255.255.255.1"; ip = ip.replaceAll("(\\d+)", "00$1"); System.out.println(ip); ip = ip.replaceAll("0*(\\d{3})", "$1"); System.out.println(ip); String[] ips = ip.split(" "); TreeSet<String> tree = new TreeSet<String>(Collections.reverseOrder()); for (String newIp : ips) { // System.out.println(newIp); tree.add(newIp); } for (String s : tree) { System.out.println(s.replaceAll("0*(\\d+)", "$1")); } } }结果如图所示: