1

これは私がコーディングバットプロジェクトのために書いたものです. どういうわけか、この方法では機能しないと書かれていますが、裏返すと機能します。何故ですか?3 文字未満のものを入力すると、codingbat に従ってエラー メッセージが表示されます。

// Given a string, return a new string where "not " has been added to the front. 
// However, if the string already begins with "not", return the string unchanged. 
// Note: use .equals() to compare 2 strings. 

// notString("candy") → "not candy"
// notString("x") → "not x"
// notString("not bad") → "not bad"

        public String notString(String str) {
                  String m;
          if ( str.substring (0,3).equalsIgnoreCase("not") && str.length () >= 3 ) // this line doesn't work in it's current state 
          // but works if I flip the two boolean expressions over the &&

                    m = str;
          else {
                    m = "not " + str;
                }
       return m;
4

3 に答える 3

3

上に投稿したコードは、長さが足りない3 文字の文字列を取得しようとしているため、3 文字より短いStringIndexOutOfBoundsException場合にクラッシュします。strsubstring

ただし、ひっくり返すときは、まず紐の長さを確認します。&&これは、が失敗することをすぐに知っていることを意味し( が でstr.length >= 3あるためfalse)、その場で条件分岐から短絡します。その結果、不可能なことを試みることはなくsubstring、クラッシュを回避できます。

リンクで述べたように、両方の論理演算子がこのように機能します ( &&(AND) と||(OR))。左側だけを評価した後で何を返すかを理解できれば、右側はまったく影響を受けません。したがって、たとえば、右辺が評価される場合でも例外がスローされますが、(true || 1/0 == 0)常に と評価されます。true

于 2013-10-23T23:11:19.057 に答える