53

基本的な Java に関する新しいボストンのチュートリアルを見ていると、彼は次のような if ステートメントを実行するように教えてくれます (中括弧に注意してください)。

if("pie"== "pie"){
    System.out.println("Hurrah!");
}

だから私は中括弧を削除しようとしました

if("pie"== "pie")
    System.out.println("Hurrah!");

そして、それはまだ機能します!私はJavaが初めてなので、なぜそれが機能するのかわかりません。そして、中括弧を削除(または追加)することでメリット/デメリットが生じるかどうかを知りたいです。

4

17 に答える 17

47

単一のステートメントの場合は同じままですが、if ブロックで複数のステートメントをグループ化したい場合は、中括弧を使用する必要があります。

if("pie"== "pie"){
    System.out.println("Hurrah!");
    System.out.println("Hurrah!2");
}

if("pie"== "pie")
    System.out.println("Hurrah!"); //without braces only this statement will fall under if
    System.out.println("Hurrah!2"); //not this one

以下が表示されます: Java のブロック

ブロックは、釣り合った中かっこの間の 0 個以上のステートメントのグループであり、単一のステートメントが許可されている場所であればどこでも使用できます。次の例 BlockDemo は、ブロックの使用法を示しています。

class BlockDemo {
     public static void main(String[] args) {
          boolean condition = true;
          if (condition) { // begin block 1
               System.out.println("Condition is true.");
          } // end block one
          else { // begin block 2
               System.out.println("Condition is false.");
          } // end block 2
     }
}

(上記リンクの例)

于 2013-04-03T12:10:17.347 に答える
7

いいえ、まったく違いはありません。中かっこのペアは、複数のステートメントを 1 つのステートメントにします。if、、、whileなどforは単一のステートメントを想定しています。ステートメントを 1 つだけガードする必要がある場合は、中かっこは必要ありません。

ただし、多くのソフトウェアショップは、単一のステートメントであっても中括弧を使用することを主張しています. 理由は次のようなエラーです。

if (x > 20)
    x -= 7;
    y -= 8;

上記のステートメントは誤解を招きます: インデントにより、実際には最初の割り当てのみが保護されているのに、両方の割り当てが保護されていると信じ込ませてしまいます。その理由は、Java の空白は重要ではないためです。ステートメントをインデントしても、プログラム全体の流れにおけるその配置は変わりません。上記のようなエラーは非常に見つけにくいため、最初からエラーを防止するためのルールを採用することをお勧めします。

于 2013-04-03T12:10:47.597 に答える
5

欠点があります。これまでに述べた答えは正しいです。しかし、物事のセキュリティの観点からは、いくつかの欠点があります。支払いチームで働いたことがあるので、セキュリティはそのような決定の動機となるより強力な要因です。次のコードがあるとします。

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

内部の問題により、このコードが機能していないとしましょう。入力を確認したい。したがって、次の変更を行います。

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

問題を修正してこのコードをデプロイするとします (そして、おそらくレビュアー & あなたは、'Prod' 条件内にないため、これは問題を引き起こさないと考えています)。魔法のように、本番ログに顧客のクレジット カード情報が出力されるようになりました。これは、ログを見ることができるすべての担当者に表示されます。それらのいずれかが(悪意を持って)このデータを入手した場合、神は禁じられています.

したがって、中括弧を付けず、少し不注意なコーディングを行うと、多くの場合、安全な情報が侵害される可能性があります。また、CERT (Software Engineering Institure、CMU)によって Java の脆弱性として分類されています。

于 2015-12-03T08:21:32.863 に答える
5

@rajesh が言うように、本体が単一のステートメントの場合、中括弧はオプションです。

そうは言っても、後でコードを変更するときに、あなた (またはあなたの後に続くプログラマー) がエラーを起こす可能性が低くなるため、一部のコーディング スタイルでは、単一のステートメントの場合でも中かっこを残すことが推奨されています。

if("pie"== "pie")
    System.out.println("Hurrah!");
    System.out.println("Tricked you");

2 番目のプリント はTricked you、実際にはifではなく、インデントのためにそのように見えるだけです。

ただし、これは単なるスタイル ポイントであり、普遍的に受け入れられているわけではありません。また、有能なプログラマーは両方の形式を読み取ることができる必要があります。

于 2013-04-03T12:13:10.767 に答える
3

中括弧は通常、ステートメントのブロックを持つためのものです。if()中括弧がないと、ステートメントの最初の行のみが実行されます。{で始まり、で終わるブロック全体ではありません}

if("pie" == "pie") {
   System.out.println("Executes if pie==pie");
   System.out.println("So does this");
}

if("pie" == "pie")
   System.out.println("Executes if pie==pie");
System.out.println("Executes, regardless of if pie is equal to pie");

ただし、2 つのStringオブジェクトを比較する場合は、 の.equals()メソッドを使用してくださいString。この例は、1 つの定数文字列をそれ自体と比較しているため (これは常に true です)、引き続き機能します。

于 2013-04-03T12:10:39.003 に答える
3

これは、Java、C++、C、および C# を含む多くの言語に適用されるスタイルの問題です。

コード ブロックに含まれる行が 1 行のみの場合、中かっこは省略できます。これは、if、while、for、do-while などのすべての制御構造に適用されます。

たとえば、次の 2 つのループは同等です。

for(int i=0; i<100; i++)
  doSomething(i);



for(int i=0; i<100; i++) {
  doSomething(i);
}

{} を省略することの利点: コードをより簡潔にすることができます。つまり、行が少なくなります。より読みやすいと感じる人もいるかもしれません。

{} を省略することのデメリット: 後でコードを変更し、コード ブロックに別の行を追加する必要がある場合は、それらの {} を忘れずに追加してください。そうでない場合は、以下のコードを記述します。

for(int i=0; i<100; i++)
  doSomething(i);
  doSomethingElse(i);

これは実際には次と同等です:

for(int i=0; i<100; i++) {
  doSomething(i);
}
doSomethingElse(i);
于 2013-04-03T12:14:01.477 に答える
2

後にステートメントが 1 つしかない場合if、中かっこは必須ではありません。

条件に該当する必要があるコード ブロックがある場合は、if中かっこを使用する必要があります。

これloopsも同様に有効です

于 2013-04-03T12:10:13.637 に答える
2

文の数が 1 の場合も同じです。複数ある場合は、{ } 構文が必要です

于 2013-04-03T12:10:41.087 に答える
2

いいえ、しかし実際の危険は、後でコードを編集するときに発生します。次のようなものを編集するのは比較的簡単です。

if (someCondition) 
    // do something 

if (someCondition) 
    // do something
    // do something else important

そして、「何か他の重要なことをする」は、someCondition が true の場合にのみ実行されると考えてください。インデントは誤解を招きます:-)

括弧があれば、この危険はありません。

于 2013-04-03T12:13:36.540 に答える
0

そして、中括弧を削除(または追加)すると、利点/欠点が生じるかどうかを知りたいですか?

それらを常に追加することの利点は、後でコード ブロックを追加する必要なく、単純に拡張できることです。次のものがあるとします。

if("pie".equals("pie"))
    System.out.println("Hurrah!");

次に、追加のコード行を追加する場合は、必ず中かっこを追加する必要があります。

if("pie".equals("pie")) {
    log.debug("I am here!");
    System.out.println("Hurrah!");
}

それらが既にそこにある場合は、カーソルを行末に置き、return キーを押して、新しいコードの追加を開始します。

1 行の場合、技術的には違いはありませんが、多くのコード規則では、常にそこにあるようにすることが提案されているか、義務付けられています。そのためのCheckStyle ルールさえあります。

于 2013-04-03T12:11:25.917 に答える
0

問題ではない単一のステートメントの場合

if("pie"== "pie")
System.out.println("Hurrah!");

中かっこが必要な場合の後の 2 つ以上のステートメントの場合

if("pie"== "pie"){
System.out.println("Hurrah!");
System.out.println("Hi!");
}

また、比較には == ではなく .equals() を使用します。

于 2013-04-03T12:11:32.743 に答える
0

いいえ、if. に応答して 2 番目のステートメントを追加する場合はif、中かっこが必要です。

于 2013-04-03T12:13:19.563 に答える
0

中括弧は、一連のコードを条件付きで実行する場合にのみ使用されます。中括弧を使用しない場合、if 条件の後の最初のステートメントのみが実行されます。残りの行 (最初のステートメントの下) は、if 部分とは見なされません。

于 2015-11-27T17:52:34.227 に答える