Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Return Type - Fatal编程技术网

Java 从方法返回错误代码

Java 从方法返回错误代码,java,oop,return-type,Java,Oop,Return Type,我想问一些让我很困惑的问题。下面是一个场景,假设我有一个方法preparePayload,它接受一些参数,如messageType,destAddr等。该方法的职责是构造一个完全有效负载(带有头、前缀等)。这就是问题所在,我想返回statusCode(这是enum,比如STATUS\u OK,STATUS\u INVALID\u DEST,STATUS\u INVALID\u MSG\u TYPE等等),而不是返回状态,我想实现我的逻辑。但是如果没有错误(状态\u OK),我需要准备好的有效负载

我想问一些让我很困惑的问题。下面是一个场景,假设我有一个方法
preparePayload
,它接受一些参数,如
messageType
destAddr
等。该方法的职责是构造一个完全有效负载(带有头、前缀等)。这就是问题所在,我想返回
statusCode
(这是enum,比如
STATUS\u OK
STATUS\u INVALID\u DEST
STATUS\u INVALID\u MSG\u TYPE
等等),而不是返回状态,我想实现我的逻辑。但是如果没有错误(
状态\u OK
),我需要准备好的有效负载继续前进。所以我的方法应该返回第十八个有效负载或状态代码

在C语言中,只需将有效负载缓冲区地址作为参数发送给preparePayload方法,就可以完美地解决这个问题。当该方法返回时,只需从缓冲区地址读取有效负载并在应用程序上移动即可。如何在Java中实现这种逻辑

此外,
preparePayload
方法只是我给出的一个示例,因此我实现的方法可能返回
String
int[]
、我编写的某个类对象等。我的意思是,在成功的情况下,该方法应返回的对象类型可能会有所不同


任何建议都非常受欢迎。

Java中正确的习惯用法是抛出一个选中的异常(有些人会说,未选中更好,这里有一点争议)

你得到的三个重要机制是:

  • 错误代码在堆栈上的自动传播。如果您不处理代码中的某种类型的错误(不检查),它将作为异常传播-您不需要分层检查(并避免返回无效结果的错误,这在C中很常见)

  • 异常作为“备用返回类型”工作,确保正确结果和错误消息的类型安全(它们是完整对象,可以包含代码之外的任何数量的有用信息)

  • 检查异常允许编译器检查是否以某种方式处理了所有重要的错误状态


您可以创建一个类,一个包装器,例如:

public class Result {
    public enum Status {
        STATUS_OK, STATUS_INVALID_DEST, STATUS_INVALID_MSG_TYPE
    }

    Status status;
    String payload;
}
这将由您的方法
preparePayload
返回。然后,当调用方法时,可以这样做:

Result result = preparePayload(args);
//better will be a switch with case for each possible status
if (result.state == Result.State.STATUS_OK)
    //do what you want with payload
    System.out.println(result.payload);
else
    return;

除了更改为异常之外,还有一种允许使用“输入/输出”参数的方法,如:

public ResultEnum preparePayLoad(List<PayLoad> toPrepare, ... other args) {
...
  PayLoad newThing = ...
...
  toPrepare.add(newThing);
  return someEnum;
}

并针对错误情况抛出(选中或未选中)异常。

我建议抛出一个异常,如
InvalidDestException
捕获此异常并将其转换为代码。在java中,除非您希望像<代码>对象。不能在Java中使用错误代码。改用异常。如果确实需要错误代码,请创建一个包装类,如
ResponseWrapper
,其中包含一个状态代码字段和另一个有效负载字段。@Arnauddenoylle:我认为抛出异常比任何语言中的代码都好。引用《干净的代码-Robert C Martin》中的这句话,我明白了,抛出异常是Java/OO概念最合适的方式。我之所以想编写更具C风格的应用程序,是因为我想快速看到方法可能的返回。无论如何,我会坚持抛出异常设计。谢谢你的解释。
public PayLoad preparePayLoad(args) {
...
  PayLoad newThing = ...
...
  return newThing;
}