0

我有一个存储服务器名称和端口的属性文件。这些值将在 中使用Enum,以便能够在不接触代码的情况下更改值。

该属性的内容如下所示:

PROD=FTPROD01:1122

问题是我必须拆分服务器和端口号,因为我使用这些值作为方法的参数:

server = properties.getProperty(this.name(), "").split(":")[0];
try {
port = Integer.valueOf(properties.getProperty(this.name(), "").split(":")[1]);
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("error");
}

如您所见,我ArrayIndexOutOfBoundsException正在捕获运行时异常,以检测是否缺少第二个值,因为如果属性文件“损坏”,程序将崩溃。

这是获得多个值的好方法,还是有其他更优雅的方法?

4

5 回答 5

5

这是获得多个值的好方法,还是有其他更优雅的方法?

当然 - 不要尝试访问无效长度的数组 - 在你做任何其他事情之前检测它。

String[] bits = properties.getProperty(this.name(), "").split(":");
if (bits.length == 2) {
  server = bits[0];
  port = Integer.valueOf(bits[1]); 
} else {
  // Log the corruption or whatever...
}

请注意,如果valueOf抛出NumberFormatException.

基本上你应该避免捕获异常,你可以避免一开始就被激怒。

于 2012-11-16T10:58:42.377 回答
3

经验法则:不要将异常用于正常流程。

您可以使用数组length来查找是否port存在,如下所示:

String[] arr = String.valueOf(properties.getProperty(this.name(), "").split(":");

server = arr[0];
if(arr.length > 1)
{
    port = Integer.valueOf(arr[1]);
}
于 2012-11-16T11:00:07.907 回答
2

当然,如果它对您有用,这是一个不错的选择:-)

不过,当有人给你一个看起来像这样的属性文件时,你会怎么做:

PROD=

提示:扩展 try/catch 并可能为 PROD 丢失时准备一个默认值:-)

干杯,

于 2012-11-16T10:59:15.143 回答
1

您可以在此之前进行检查以确保属性值
if(properties.getProperty(this.name(), "").split(":").length > 1)
通过这种方式,您可以删除您的异常处理代码:)

于 2012-11-16T11:02:34.047 回答
0

只需拥有像

PROD.SERVER=FTPROD01
PROD.PORT=1122

属性主要用于键和值。

于 2012-11-16T11:00:27.377 回答