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