Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组的异常处理_Java_Arrays - Fatal编程技术网

Java 数组的异常处理

Java 数组的异常处理,java,arrays,Java,Arrays,我正在打印一系列电话簿的条目。但是,如果某个对象已被删除,我希望打印一条消息,说明该对象已不存在,然后继续打印阵列的其余部分。此时,我收到消息说缺少条目,但它停止并没有打印出数组的其余部分。可能吗 public class Entry { String surname; String initial; String number; public Entry(String surname, String initial, String number) { this.surname =

我正在打印一系列电话簿的条目。但是,如果某个对象已被删除,我希望打印一条消息,说明该对象已不存在,然后继续打印阵列的其余部分。此时,我收到消息说缺少条目,但它停止并没有打印出数组的其余部分。可能吗

public class Entry {

String surname;
String initial;
String number;


public Entry(String surname, String initial, String number) {
    this.surname = surname;
    this.initial = initial;
    this.number = number;
}

public String getSurname(){
    return surname;
}

public String getInitial(){
    return initial;
}

public String getNumber() {
    return number;
}

void setNumber(String number){
    this.number = number;
}

public String toString(){
    return surname+ "\t " +initial+ "\t" +number;
}
}



import java.util.Arrays;

public class ArrayDirectory implements Directory{


int DIRECTORY_SIZE = 6; 
Entry [] directory = new Entry[DIRECTORY_SIZE];
int numberOfElements = 0;


public void addEntry(String surname, String initial, String num) {

    int i = findFreeLocation();     
    directory[i] = new Entry(surname, initial, num);
    numberOfElements++;
}


public void deleteEntry(String surname, String initial){
    // TODO delete entry via name
//  if ()
    int i = findEntryIndex(surname, initial);                     
    directory[i] = null;
    numberOfElements--;
}


public void print() throws EntryNotFoundException{

    for(int i = 0 ; i < DIRECTORY_SIZE ; i++){

        if(directory[i] != null){

            System.out.println(directory[i].toString());
        }
        else{
            throw new EntryNotFoundException("Entry Missing");
        }
    }
}

private int findEntryIndex(String surname, String initial) {
    int i;
    for (i = 0; i < DIRECTORY_SIZE; i++) 
    {
        if(directory[i] != null && directory[i].getSurname().equals(surname) && directory[i].getInitial().equals(initial))
        { 
            break;
        }
    }
    return i;
}



private int findEntryIndex(String number) {

    int i;
    for (i = 0; i < DIRECTORY_SIZE; i++) // private method to find index of an Entry within the array directory
    {
        if(directory[i] != null && directory[i].getNumber().equals(number))
        { 
            break;
        }
    }

    return i;
}


private int findFreeLocation() {

    int i;
    for (i = 0; i < DIRECTORY_SIZE; i++) 
    {           
        if(directory[i] == null)
        { 
            break;
        }
    }
    return i;
}
}
您需要捕获异常,而不是允许它向调用方抛出自身

比如:

try {

    // do something that may throw an exception

} catch (TheSpecificExceptionYouExpect e) {
    // either handle the exception, log it, print it, or ignore it.
    // here's how to print it
    e.printStackTrace();
}

然后您的程序将继续正常运行。当抛出异常时,控件会立即返回给调用方,从而停止方法的执行。

不幸的是,抛出异常的定义是中断整个调用堆栈,直到异常被处理为止。这意味着,除非您在for循环本身内部处理异常,或者不抛出异常,只是行为不同,否则您将无法在抛出异常后继续打印任何内容。只需将代码更改为不引发异常,并打印出不同的内容以指示失败:

public void print() throws EntryNotFoundException{

    for(int i = 0 ; i < DIRECTORY_SIZE ; i++){

        if(directory[i] != null){

            System.out.println(directory[i].toString());
        }
        else{
            //this breaks up to the point it is handled,
            //and we can't continue in the loop at the same
            //point this was thrown later in code
            //throw new EntryNotFoundException("Entry Missing");

            //Just print out a different response
            System.out.println("Entry Missing");
        }
    }
}

这里不需要抛出异常,您自己说过要打印缺少的条目并继续。这是标准的代码流:

public void print() {
    for(int i = 0 ; i < DIRECTORY_SIZE ; i++) {
        if(directory[i] != null){
            System.out.println(directory[i].toString());
        }
        else{
            System.out.println("Missing Entry: #"+i);
        }
    }
}

一旦抛出异常,它就会离开该方法。做一些类似于记录缺少的元素的事情,如果缺少了什么,那么可能会在一切完成后抛出异常。然后它会打印所有内容,您将看到缺少哪些元素


实际上,不要使打印无效,只返回状态=基本上不要滥用异常,除非这是一个学习练习..顺便说一句,异常可能代价高昂

如果不想中断循环,为什么要抛出异常?这是您的代码吗?在方法本身中处理异常。不要扔它。如果数组中不存在一个条目是一个有效的数据场景,那么它就没有什么特别之处。在这种情况下,抛出异常不是合适的做法。如果失败,则从所有方法返回-1。默认情况下,它返回给您的目录大小将产生问题。@Braj这不是我们谈论的C-P void是可接受的返回类型。@JohnSetter无需担心。从您的个人资料来看,您似乎在自学Java。我为你感到荣幸