如何在Java中实现适当的异常处理?

如何在Java中实现适当的异常处理?,java,Java,我目前正在用Java编写一个简单的程序来回答一个问题。问题是: 您正在修复文档(表示为字符串)无法转换为正确xml的错误。出现此问题的原因可能是: A.xml中的某些字符失败,或 B.传入的文档长度大于100个字符(它们是小文档) 然后列出5个需要转义的字符(例如,用转义序列替换“>”;) 我已经对部件进行了编码,以用转义符替换特殊字符,但我不确定如何处理长度 if (length of string > 100) { do what? } 我在考虑可能实现一个try-catch

我目前正在用Java编写一个简单的程序来回答一个问题。问题是:

您正在修复文档(表示为字符串)无法转换为正确xml的错误。出现此问题的原因可能是:
A.xml中的某些字符失败,或
B.传入的文档长度大于100个字符(它们是小文档)

然后列出5个需要转义的字符(例如,用转义序列替换“>”;)

我已经对部件进行了编码,以用转义符替换特殊字符,但我不确定如何处理长度

if (length of string > 100) {
    do what?
}

我在考虑可能实现一个try-catch语句,但这是用于运行时异常的,对吗?(空指针等)。从设计的角度来看,在完成函数工作的同时避免此错误的最佳方法是什么?

您在这里没有处理异常,而应该抛出一个异常:

private static final int MAX_LENGTH = 100;
// ...

if (inputString.length() > MAX_LENGTH) {
  throw new IllegalArgumentException(
      String.format("String is too large. Found %d characters, maximum is %d.",
          inputString.length(), MAX_LENGTH));
}

这是通知方法的用户他们已违反API的典型方式。请确保您的方法文档指定字符串不能超过100个字符。

此处您没有处理异常,而应该抛出一个异常:

private static final int MAX_LENGTH = 100;
// ...

if (inputString.length() > MAX_LENGTH) {
  throw new IllegalArgumentException(
      String.format("String is too large. Found %d characters, maximum is %d.",
          inputString.length(), MAX_LENGTH));
}

这是通知方法的用户他们已违反API的典型方式。确保方法文档指定字符串不能超过100个字符。

创建自己的异常类:

public class FileTooLongForXmlException extends Exception{
    public FileTooLongForXmlException() {
        super("Your file is > 100 carac");
    }
}
然后你只要做:

if (length of string > 100) {
    throw new FileTooLongForXmlException();
}

创建自己的异常类:

public class FileTooLongForXmlException extends Exception{
    public FileTooLongForXmlException() {
        super("Your file is > 100 carac");
    }
}
然后你只要做:

if (length of string > 100) {
    throw new FileTooLongForXmlException();
}

当发生异常时,应该发生异常。您永远不应该使用异常编码来控制业务逻辑(特别是如果它是像NoEntityFound这样的第三方异常,那么如果抛出的第三方异常周围的规则发生变化怎么办?)

如果长度确实是您需要暂停并告诉用户的内容,则抛出一个自定义异常,例如

throw new IllegalStringLength("String length invalid");
然而,如果这是一种不用抛出异常就可以做的事情,并且可以更优雅地处理,我通常会说这样做更好。这不像是空指针或数据库无法连接


然后,您必须捕获上述异常并将其输出给用户(同样,使用异常来控制您的应用程序流)。

异常发生时应发生异常。您永远不应该使用异常编码来控制业务逻辑(特别是如果它是像NoEntityFound这样的第三方异常,那么如果抛出的第三方异常周围的规则发生变化怎么办?)

如果长度确实是您需要暂停并告诉用户的内容,则抛出一个自定义异常,例如

throw new IllegalStringLength("String length invalid");
然而,如果这是一种不用抛出异常就可以做的事情,并且可以更优雅地处理,我通常会说这样做更好。这不像是空指针或数据库无法连接


然后,您必须捕获上述异常并将其输出给用户(同样,使用异常控制应用程序流)。

如果我理解正确,您的函数将长度<100的字符串转换为XML。因此,从设计角度来看,当给定字符串长度>=100时,抛出IllegalArgumentException没有问题


您不应该尝试继续执行,异常会停止函数的执行,这是有原因的-以确保符合函数约定的正确结果。

如果我理解正确,您的函数会将长度<100的字符串转换为XML。因此,从设计角度来看,当给定字符串长度>=100时,抛出IllegalArgumentException没有问题



您不应该尝试继续执行,异常会停止函数的执行,这是有原因的-以确保符合函数契约的正确结果。

可能您正在考虑抛出异常,未捕获它-->
throw
try catch
用于非
RuntimeException
类型的异常。@Theodoroschatzigannak绝对不正确。@Theodoroschatzigannak用于非
RuntimeException
的异常是方法中的
throws
子句声明。也许你正在考虑抛出异常,未捕获它-->
throw
try catch
用于非
RuntimeException
类型的异常。@Theodoroschatzigannak绝对不正确。@Theodoroschatzigannak用于非
RuntimeException
的异常是方法中的
throws
子句声明。这就是我要找的,我忘了抛出异常。Thank.FWIW如果异常消息包含观察到的字符串长度和限制,那么它将非常有用。例如,
“字符串太大(找到532个字符,最多允许100个字符)”
。从经验来看,一条只说“不”的错误消息比一条告诉你原因的错误消息更没有帮助(/更令人愤怒)。@AndrzejDoyle非常正确。为了简洁起见,我省略了那个层次的细节,但你完全正确。我已经进行了相应的编辑。这就是我一直在寻找的,我忘记了抛出异常。Thank.FWIW如果异常消息包含观察到的字符串长度和限制,那么它将非常有用。例如,
“字符串太大(找到532个字符,最多允许100个字符)”
。从经验来看,一条只说“不”的错误消息比一条告诉你原因的错误消息更没有帮助(/更令人愤怒)。@AndrzejDoyle非常正确。为了简洁起见,我省略了那个层次的细节,但你完全正确。我已经相应地编辑了。。。。大概如果可能的话,我总是尝试使用现有的异常(比如
IllegalArgumentException