Java中if语句中的异常处理

Java中if语句中的异常处理,java,error-handling,Java,Error Handling,我是Java中自定义错误处理的新手,我正在尝试找出如何使用catch语句在if语句中传递特定消息。我想多看几眼,看看我想做什么,并在我完全想得太多、做得太过分之前提供反馈 考虑: 我们有一个每小时日志文件的目录,我有一个按需报告作业,它将目前创建的所有日志文件连接起来。我想添加一个步骤,检查是否存在连接的日志文件,删除它,然后创建它(如果存在),或者只创建它(如果不存在)。对于下面的代码,如果由于某种原因无法创建新文件,我将返回一个异常 try { File file = new File

我是Java中自定义错误处理的新手,我正在尝试找出如何使用
catch
语句在if语句中传递特定消息。我想多看几眼,看看我想做什么,并在我完全想得太多、做得太过分之前提供反馈

考虑: 我们有一个每小时日志文件的目录,我有一个按需报告作业,它将目前创建的所有日志文件连接起来。我想添加一个步骤,检查是否存在连接的日志文件,删除它,然后创建它(如果存在),或者只创建它(如果不存在)。对于下面的代码,如果由于某种原因无法创建新文件,我将返回一个异常

try {
   File file = new File (destinationPath + "todayToNowLogFile.csv");
   if(file.exists())
   {
      if(file.delete()) 
      {
      System.out.println(file.getName() + " is deleted!");
      } else {
      System.out.println("Existing file cannot be deleted.")
      } 
   } else {
      System.out.println("File will be created.");
   }
}
 //
catch(Exception e) {
   System.err.println("Exception: ");
   System.out.println("Exception: "+ e.getMessage().getClass().getName());
   e.printStackTrace();
}
现在,如果文件无法删除,我想显示防止文件删除的异常。首先,我需要捕捉那个错误,但是我应该把
try
放在哪里呢

做这样的事

try 
{  
   if(file.delete()) 
   {
      System.out.println(file.getName() + " is deleted!");
   }
}
else {
   catch(Exception eDel) {
       System.err.println("Exception: ");
       System.out.println("Exception: "+ eDel.getMessage().getClass().getName());
       eDel.printStackTrace(); 
    }
}
..中断<代码>如果…那么块。我不知道如何在
if…then
中插入
try…catch
。有办法做到这一点吗?或者我的原始代码是否捕获了与
try
块中定义的
文件
上的任何操作相关联的所有错误,并且我需要将
if…然后
逻辑放入
catch
块中,类似于此伪代码的东西

catch(Exception e) {
   if(exception relates to file deletion) {
       "File delete exception " + exceptionMessages;
   } else if(exception relates to file creation) {
       "File create exception " + exceptionMessages;
   } else if(other exception) {
       "other exception " + exceptionMessage;
   } else {
       "no exceptions encountered"
   }
}

处理这种情况最合适的方法是什么?

你应该把
try/catch
看作是任何其他语句。因此,您可以将它放在
if/then/else
语句的两个分支中的任意一个分支中,但它必须是完整的:

if(statement){
    ...    
    try{
        ...
    }catch(...){
    ...
    }
    ...
}else{
    ...    
    try{
        ...
    }catch(...){
    ...
    }
    ...
}
如果必须捕获多个异常,可以通过多个捕获部分来实现:

    try{
        ...
    }catch(Exception1 e1){
    ...
    }catch(Exception2 e2){
    ...
    }catch(Exception3 e3){
    ...
    }

首先,您应该检查是否有任何方法可以抛出任何特定的异常。您可以通过查看Javadoc或使用您最喜欢的IDE来实现这一点

如果将Exception捕获为Exception类,它将捕获作为其子类的每个异常

如果您想进行特定的异常处理,例如对于delete()方法中的IOException,您可以捕获每个特定的Exceptionclass,或者在Java 7中使用multi-catch

try {

    do regular code that can throw exceptions

} catch(Exception e) {
    it catches every Exception that is a subclass of Exception.
    You handle every exception raised in the try block above by the same way
}
如果要以不同的方式处理异常,例如打印不同的消息,只需按照以下示例执行此操作:

try {
    do sth
} catch (SpecificExceptionclass sec) {
    do sth specific for this exception
} catch (AnotherExceptionClass aec) {
    do sth else
}
或者在Java 7中使用Multicatch,如果您希望对某些特定的异常类进行相同的异常处理:

try {
    do sth
} catch (SpecificExceptionclass | AnotherExceptionClass e) {
    do sth specific for this exception
}

要实现代码中抛出的不同异常,这些方法至少应该抛出不同的异常。在使用file.exists()和file.delete()的示例中,代码只引发了一个IOException,因此没有使用特定的异常处理。

我认为最好将代码放在返回true或false的函数中。

1:True表示文件不存在,并且已创建
2:False表示文件存在并已删除。
3:如果文件存在但无法删除,则为异常。

还提供一个单独的函数来确定文件是否存在。

函数顶部的javadoc应该解释上述内容,这样函数的调用方就不必查看它们的内容来确定如何使用它们。

注意:异常是一个不寻常的事件,不应该抛出它来指示插入/删除的状态。它应该为呼叫方通常不会遇到的异常情况保留。


关于异常的注意事项:如果您有一个包含1000个类的大型项目,每个类平均有20个函数,那么这就是20000个函数。在每个函数中添加过多的异常处理(例如检查作为参数传入的null)是不实际的。解决方案是用java语言(FileIO)处理已检查的异常,并让(大部分)未检查的异常在函数调用链中波动,直到您离开所有业务逻辑并即将显示结果为止。只有在重新引用异常之前向异常添加其他信息时,才能捕获它们。示例:添加要抛出的SQLExeption记录的主键值,以便了解导致问题的记录。在返回用户之前,记录堆栈跟踪并向用户显示一条简化的消息(不是堆栈跟踪)。函数的调用方应该阅读其javadoc以了解如何使用它。如果他违反了您的javadoc,函数可能会也可能不会抛出异常。他有责任遵循javadoc。最后一点:您的项目应该为整个项目制定通用的编码策略,以防止调用者意外引入某些类型的异常,例如:所有函数都不接受null作为参数,或者除非在其javadoc中指定,否则将返回null。除非在javadoc中指定,否则所有函数都将正确地接受空列表或空字符串作为参数(或返回)

这里需要创建自己的异常类

要创建一个异常类,您需要扩展异常类。这里有一个例子。 假设我的自定义异常类应命名为
MyFileErrorException

所以我创建了一个像这样的新类-

class MyFileErrorException extends Exception {

    private String message = null;

    public MyFileErrorException() {
        super();
    }

    public MyFileErrorException(String message) {
        super(message);
        this.message = message;
    }

    public MyFileErrorException(Throwable cause) {
        super(cause);
    }

    @Override
    public String toString() {
        return message;
    }

    @Override
    public String getMessage() {
        return message;
    }
}
if(file.delete()) 
      {
      System.out.println(file.getName() + " is deleted!");
      } else {
      try{
            System.out.println("Existing file cannot be deleted.")
            throw new MyFileErrorException("File Could not be deleted val is null");
      }catch(MyFileErrorException ex){

        //Do wahtever you want to do
      }

      } 
现在我需要随意抛出这个异常。因此,在您的情况下,您希望捕获文件删除异常,因此代码如下所示-

class MyFileErrorException extends Exception {

    private String message = null;

    public MyFileErrorException() {
        super();
    }

    public MyFileErrorException(String message) {
        super(message);
        this.message = message;
    }

    public MyFileErrorException(Throwable cause) {
        super(cause);
    }

    @Override
    public String toString() {
        return message;
    }

    @Override
    public String getMessage() {
        return message;
    }
}
if(file.delete()) 
      {
      System.out.println(file.getName() + " is deleted!");
      } else {
      try{
            System.out.println("Existing file cannot be deleted.")
            throw new MyFileErrorException("File Could not be deleted val is null");
      }catch(MyFileErrorException ex){

        //Do wahtever you want to do
      }

      } 

java.io.File#delete
只有在您没有删除该文件的权限时才会引发异常。如果你使用Java 7,考虑使用<代码> java .Nio.file .java文件>删除/<代码>,因为它会为更多的情况抛出更多的异常。如果将它放在<代码> > 块,像其他任何块,例如,另一个代码>如果。你真正想要的是创建你的自定义异常。见下面我的回答。