为什么String.indexOf不使用异常但在找不到子字符串时返回-1?

ari*_*iso 14 java exception-handling

为什么String.indexOf不使用异常但在找不到子字符串时返回-1?

这个问题的目的是:当我们开始自定义异常时.

我相信避免需要返回特殊错误代码是正确的设计路径.

你怎么看?

Pau*_*lin 30

根据经验,如果方法的目的是检查某些东西,那么缺少某些东西不应该是一个例外.如果方法假设某些事情是真的,那么缺少那个东西将是一个例外.因此"File.exists()"不会抛出FileNotFoundException,但"File.open()"会抛出.


z *_* - 18

异常是针对特殊情况,当字符串不包含字母时,这几乎不例外,除非您在某些极端情况下使用它.如果这就是你在做什么,你总是可以选择抛出自己的异常.

  • +1表示"例外情况适用于特殊情况".有人可能会问,"为什么File.exists()没有抛出FileNotFoundException而不是返回false"?类似的概念; 你在这两种方法中都称这种方法很可能是负面的. (4认同)

Gis*_*shu 16

最后我听到的是......

"当你的方法无法做到它所承诺的时候,你会抛出异常" - Jeff Richter CVC第二版

  • IndexOf()承诺返回第一次出现的char/string的索引.如果由于某种原因无法完成工作,它会引发异常.它完成了它的工作,但没有找到字符串,因此返回-1来传达未找到的结果.
  • File.Open()将为不存在的文件路径抛出FileNotException,因为它无法执行它所承诺的内容.即打开指定的文件.

  • 在这里添加保罗的评论.作为一条经验法则,如果方法的目的是检查某些东西,那么缺少某些东西不应该是例外.如果方法假设某些事情是真的,那么缺少那个东西将是一个例外.因此"File.exists()"不会抛出FileNotFoundException,但"File.open()"会抛出. (2认同)

ega*_*aga 6

返回-1几乎和抛出异常一样可怕.正确的方法是使用选项类型,如果语言更好地支持它.在有结果的正常情况下,将结果包装在对象中并返回.否则,您将返回表示"未结果"情况的对象.

在呼叫站点,你必须检查它是哪一个; 你不能只使用返回值因为它们的超类型,它们必须通过模式匹配进行检查.

在伪语法中:

class Option[a] = Some[a] | None,
Run Code Online (Sandbox Code Playgroud)

其中a是泛型类型参数,Some表示带有值的结果,None表示没有值的非结果.

在indexOf的情况下你会有:

Option[Integer] indexOf(char c) = {
   if(found) return Some(index)
   else return None
}
Run Code Online (Sandbox Code Playgroud)

你用这种方式:

result = "uncle".indexOf('c')
result match {
  Some(i) => System.out.println("index was: " + i);
  None => System.out.println("no value");
}
Run Code Online (Sandbox Code Playgroud)

如果你从匹配中省略了Some或None(这是一种通用的开关),编译器会给你一个警告.

  • Eljenso,因为它背后没有任何意义,它可能也是-3424.一个必须要记住的另一个神奇数字. (4认同)
  • @eljenso从实际的角度来看,我不同意。-3424很难记住。请注意,字符串的索引是从零开始的,因此,如果返回整数来表示长度范围为0 <= n的字符串范围之外的某个值,-1似乎比-3424好得多。如果它们索引从-3424开始的字符串中的字符,对您来说还可以吗?毕竟0(或1)也是任意数字... (2认同)