现在的位置: 首页 > 综合 > 正文

第十六天:异常处理

2018年01月29日 ⁄ 综合 ⁄ 共 4713字 ⁄ 字号 评论关闭

@Override
public int lastIndexOf(Object o) {
//必须考虑元素为空的情况。因为空不空比较的方法不一样。
if(o==null){
for (int i = size-1; i >=0; i--) {
if (data[i] == null) {
return i;
}
}
}else {
for (int i = size-1; i >=0; i++) {
if (data[i].equals(o)) {
return i;
}
}
}
return -1;
}

系统登录实例
  系统登录
    1 根据用户名找到用户对象
    2 比较用户对象的密码与当前密码是否一致
    
散列表概念
  1 容量: 散列表中散列数组大小.
  2 散列运算: key->散列值(散列数组下标)的算法
   如: "mm".hashCode()%10->8
  3 散列桶: 散列值相同的元素的"线性集合"
  4 加载因子: 就是散列数组加载率, 一般小于75%性能比较理想
   就是:元素数量/散列数组大小, 如: 7/10=70%
  5 散列查找: 根据Key计算散列值, 根据散列值(下标)找到
    散列桶,在散列桶中顺序比较Key, 如果一样, 就返回value
  6 散列表中Key不同, Value可以重复
 
 /**
  在方法中不能随便写一个throw 。。。。因为如果真的出错,它一定会使整个软件停止运行。
  这样是不好的,所以我们通常的做法都是先捕获异常,然后根据具体的业务逻辑,再进行
  处理。
 
 */
 
    
异常
 1 行为的意外结果
 2 一个方法如果抛出了异常,这个方法就必须声明异常的抛出.
   异常的声明:在方法上声明方法的意外结果,如: 
     User reg(String name, String pwd, String email)
       throws UserExistException;
     User login(String name, String pwd)
       throws NameOrPwdException;
     
 3 异常类一般继承于Exception
 4 调用抛出异常的方法,必须处理异常
   4.1 使用try catch finally 捕获
   4.2 直接再抛出异常
   4.3 捕获 再抛出.
   处理方式,依赖于具体业务逻辑,很灵活。
   
   
 5 如果代码有异常发生,异常以后的代码将不再执行。
   
   
 6 try catch finally
  try 是尝试运程代码块,如果有异常会被随后的catch捕获
  异常发生以后代码不执行
  catch代码块是异常处理代码。需要提供合理的处理,异常的处理
  是与具体业务逻辑有关。可以写多个catch处理一系列异常,但是
  要注意:异常的大小关系,大类型的放到后面处理。因为大的异常放到前面后面的代码根本不会执行,
 例如在每一个catch里面写上Exception那么后面的谁也不可能捕捉的到。不过,我们的编译器
 中也不允许大家这样写,会出错 。
  有的时候 catch(Exception) 粗粒度处理异常,代码简洁
  语义含糊. 根据业务逻辑适当选用。
  finally 代码块,不管是否出现异常,总会执行的代码块。
  经常用来处理现场的清理,比如:可靠的数据库连接关闭。
 
 7 异常有一个基本原则:能够底层处理的尽量处理,但是
   如果不能处理,必须抛出到调用者(方法)。不应该简单的
   抛弃。
   
 8 异常捕获再抛出, 是一种把底层异常进行封装,转换为另外
   一种异常类型。
 9 *建议在捕获到异常时候使用e.printStackTrace(),打印到
 控制台,输出内容是:出现异常时候的方法调用堆栈.
 一般情况下,凡是捕获异常代码都输出:e.printStackTrace()
 
 
 10 异常的分类(异常的继承分类。)
  Throwable(是所有根,有两个子类,Error和Exception) 
    |--Error 是系统不可恢复的错误,由JVM发生
    |   |--OutOfMemoryError 堆内存溢出
    |   |--StackOverflowError 栈内存溢出(死递归会出现这种情况,因为所有的变量都在栈内存中碰到的,一般64M或者128M)
    |--Exception 程序可以检查处理的异常,常见的异常继承根
        |--java.text.ParseException format解析对象时候发生
        |  如:Date d = dateformat.parse("2010-5-5");
        |--RuntimeException(以下都是它的子类) 非检查异常,Javac忽略对
             |      这类异常的语法检查,如:异常抛出,异常处理等。
             |--IllegalArgumentException  
             |--NullPointerException  *
             |--ArrayIndexOutOfBoundsException * 
             |--ClassCastException *
             |--NumberFormatException * Integer.parseInt() 
 11 软件中会大量使用自定义异常,一般从Exception继承。
  异常类命名要有实际意义。
 
面试中会问:请至少说出八种异常 
  
  
  
IO 输入与输出(Input/Output) 
  1 在包:java.io
  1 File 类, 代表文件/文件夹(目录) file不仅代表demo也代表文件夹
    a 查看文件/目录属性
     目录: 相对目录: 是JavaVM启动的目录, Eclipse中
     默认的相对目录是: 项目文件夹!
System.out.println("得到文件或者文件夹绝对路径:"+bin.getAbsolutePath());
System.out.println("是否是目录:"+bin.isDirectory());
System.out.println("是否是文件:"+bin.isFile());
System.out.println("是否可读:"+bin.canRead());
System.out.println("是否可写:"+bin.canWrite());
System.out.println("是否可执行:"+bin.canExecute());

File file = new File("src\\day16\\FileDemo.java");
//  File file = new File("src/day16/FileDemo.java");
java中的路径反正都行,是为了跨平台。

    b 创建文件/目录
     //管理文件/目录
File dir = new File("demo");//此时demo表示一个文件或者文件夹
System.out.println(dir.exists());
if(!dir.exists()){
dir.mkdir();
try {
dir.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(dir.exists());
File test = new File("tt");
dir.renameTo(test);
dir.delete();
test.delete();
    
    
    c 访问文件系统(目录系统), 列文件/列目录/过滤列目录
    
    
//访问文件系统(目录系统)
File work = new File(".");
String[] list = work.list();
System.out.println("Content in "+work.getAbsolutePath());
for (int i = 0; i < list.length; i++) {
String name = list[i];
System.out.println(name);
}


寻找符合某条件的某个目录下的所有文件:
public static void main(String[] args) {
File file = new  File("src/day16");
final String string = ".java";
String[] list = file.list(new FilenameFilter() {
/**
* 参数:
dir - 被找到的文件所在的目录。
name - 文件的名称。 
返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。

内部类不能够重写它的构造方法
*/
@Override
public boolean accept(File dir, String name) {
if (name.endsWith(string)) {
return true;
}
return false;
}
});
    
 //   return 想要可以跟任何表达式,但它要与这个方法的返回值,相匹配。
  //  return name.endsWith(string)返回是boolean类型 
  
 // 更加强大的类是列出子目录下的所有文件:ListAllDemo(用递归做的)
 
 package day16;

import java.io.File;
import java.io.FilenameFilter;

public class ListAllDemo {

/**
* @param args
*/
public static void main(String[] args) {
File file = new File("src");
list(file, ".java");

}

 /**
  * 显示指定文件夹的指定类型的文件
  * 递归处理子文件夹
  * @param dir
  * @param ext
  */
public static void list(File dir,String filterString){
System.out.println("-------");
System.out.println(dir.getAbsolutePath());
System.out.println("-------");
listFiles2(dir, filterString);
//获得当前目录下的所有文件或者子目录
File[] allFiles = dir.listFiles();
for (int i = 0; i < allFiles.length; i++) {
File d = allFiles[i];
//如果是目录的话,则把这个目录下的文件迭代一下。
if(d.isDirectory()){
list(d, filterString);
}
}
}



public static void listFiles2(File dir,final String filterString){
  String[] allFiles = dir.list(new FilenameFilter() {

@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(filterString);
}
});
  
  for (int i = 0; i < allFiles.length; i++) {
System.out.println(allFiles[i]);
}
}

}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  // files.listFiles()//列出该目录下的所有文件和子目录。
    
预习: Java 输入与输出流 InputStream/OutputStream
 

  
  
  

    
    

抱歉!评论已关闭.