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。我为你感到荣幸