if后面只有一句话,该不该加大括号?

原则上,for循环和if语句如果后面跟着只有一句话,是可以不加的,但是为了代码安全和良好的变成习惯,还是加上好。原因如下:

文章地址   http://blog.csdn.net/java2000_net/article/details/2835995

看上去一个很简单的问题,结果却不是想象中的那样。良好的编码习惯是多么的重要啊

原文地址:http://topic.csdn.net/u/20080825/18/34F53E23-ECBC-4A91-B8B5-8C7F2A07F50A.html

测试的代码如下

  1. public class TestPrintStream1 {
  2.   public static void main(String[] args) {
  3.     Class c = TestPrintStream1.class;
  4.     try {
  5.       Object o = c.newInstance();
  6.       
  7.       if (o instanceof TestPrintStream1)
  8.         TestPrintStream1 tt = (TestPrintStream1) o;// 这里为什么会报错呢,说tt 和 TestPrintStream1不能不解析
  9.     } catch (InstantiationException e) {
  10.       e.printStackTrace();
  11.     } catch (IllegalAccessException e) {
  12.       // TODO Auto-generated catch block
  13.       e.printStackTrace();
  14.     }
  15.   }
  16. }

那一行为什么会报错呢?if语句后面不是允许不加大括号吗?

2楼 java2000.net

if () 
后面不使用花括号时,里面不能出现声明,因为那个涉及到作用域,而没有花括号又没有作用域了。 
个人理解。 
boolean ok = true; 
if(ok) 
  MyClass c = new MyClass(); 
这样也是不允许的。 
改成 
MyClass c = null; 
if(ok) 
  c = new MyClass(); 
这样是可以的 
这个代码问题和 instanceof 没有任何关系 


6楼 segazk

Java 把 Test tt = new Test(); 当两条语句看待了相当于 Test tt; tt = new Test(); 

Eclipse 中报的语法错误是: 
Test cannot be resolved tt cannot be resolved

cmd 下 javac 没通过编译报的错误是:
 D:/Test.java:x: 不是语句 
Test tt 
=   new  Test();
 
^  D:/Test.java:x: 需要  ' ; '  
Test tt 
=   new  Test();
 
^   2  错误


20楼 bao110908
Java Language Specification 明确指出局部变量声明的作用范围是在一个 
块内,也可以理解为在“{  }”内。for 循环可以不使用“{ }”的,但仅限于 
执行语句(其中并不包括变量声明语句) 

我们看到的代码是这样的: 
01  public class TestPrintStream1 {
02
03      public static void main(String[] args) {
04
05          Class c = TestPrintStream1.class;
06          try {
07              Object o = c.newInstance();
08              if (o instanceof TestPrintStream1)
09                  TestPrintStream1 tt = (TestPrintStream1) o;
10          } catch (InstantiationException e) {
11              e.printStackTrace();
12          } catch (IllegalAccessException e) {
13              e.printStackTrace();
14          }
15      }
16  }
由于变量作用域的关系,编译器所看到的代码是这样的,注意 09 行的缩进! 
01  public class TestPrintStream1 {
02
03      public static void main(String[] args) {
04
05          Class c = TestPrintStream1.class;
06          try {
07              Object o = c.newInstance();
08              if (o instanceof TestPrintStream1)
09              TestPrintStream1 tt = (TestPrintStream1) o;
10          } catch (InstantiationException e) {
11              e.printStackTrace();
12          } catch (IllegalAccessException e) {
13              e.printStackTrace();
14          }
15      }
16  }

从 08 和 09 行编译器所理解的代码中来看,很明显 08 行的 if 语句并没有 
结束,因此编译器会认为 if 后面少掉一个语句结束的分号。 

笨笨地编译器猜想你的代码应该是这样的,注意 08 行后面的分号 
08              if (o instanceof TestPrintStream1);
09              TestPrintStream1 tt = (TestPrintStream1) o;

实际上编译器的这种理解并不是我们想要的。 

为了不出现我们所不知的东西来困扰,应该老老实实地在 for, if, while 等语句后面加 
上 {  },哪怕块中的语句只有一行。


37楼:wargrey
各位,这里有没有熟悉C语言的朋友,相信大家都知道,在C语言里,变量的声明都是要出现在作用域的第一条非赋值语句前的。所以java也是c风格的语言, 它也可能有类似的很细节的规则,就是,java的变量声明必须是一条语句。而java的每个作用域里面的语句分割符是“;”,if (true) statemenet;只是一条语句,并且如12楼所说,javac提示缺少;,因为它认为声明是一条新语句,而这里却不是。另一个方面javac在解析 到单行if时会假设后面应该是个表达式之类或语句,而声明不是关键字,所以它报出无法解析。

 
 
  1. if (true)
  2.     new Object();
并不报错。 但是
  1. if (true)
  2.      int a;
  3. if (true)
  4.      int a=3;
也都报了类似的问题。 


接触过vb的朋友也知道,vb有块if语句和行if语句,虽然java没有明确提到,但是if (true) statemenet;就是行if语句。行内的作用域与if所在作用域相同。因为作用域是由{}决定的。只是lz提到的问题很难碰到(如果严格参考 java规范的化),所有平时也没人会去考虑。当然我无法证明这个作用域究竟是什么! 

这是我的理解。


70楼:ZjJ_Sir
try { 
      Object o = c.newInstance(); 
      
      if (o instanceof TestPrintStream1) 
      { 
        TestPrintStream1 tt = (TestPrintStream1) o; 
      } 
}这样很明确,tt的作用域在if(){}的{}内({}是块作用域的标志)所以程序没有问题,而: 
try { 
      Object o = c.newInstance(); 
      
      if (o instanceof TestPrintStream1) 
        TestPrintStream1 tt = (TestPrintStream1) o; 
}编译器在编译这段代码时,当编译到TestPrintStream1 tt = (TestPrintStream1) o;时,会确定tt的作用域是在try{}的{}中。这明确几点,编译器在编译if语句时,并不对if语句表达式的对错作出判断,程序在执行时才对if语 句表达式的对错做判断。还有就是编译器编译代码是顺序编译的。(这都是编译原理中的知识,这里要用到这些知识来解决这个问题)当编译器编译 TestPrintStream1 tt = (TestPrintStream1) o;时,编译器不能确定是否会生成tt对象(因为if语句表达式的对错没有确定)并且编译器不能确定这句后是否会用到tt对象。这样就有可能出现:tt对 象没有生成(if表达式错),而在TestPrintStream1 tt = (TestPrintStream1) o;的后面又要用到tt对象,这样程序会出错,也可能出现其他其他三种情况。但这已经不重要了,因为有了这种情况,tt的定义已经出现了歧义,所以编译器 无法编译。这有很多解决方法。

在做些说明:像以上的代码形式, 

int j = 0; 

if (j == 0) 

  int i = 1; 

在C、 c++ 和C#中都是正确的,即使在Vs2005中这样的Java代码也是正确的,因为这种形式的代码在不同的编译方法中会有不同的解释(比如这样的形式 i 的作用域被默认为与if(){}形式中的一样。那么这样的形式就会正确)。从这可以看出,1、编写代码时,尽可能的与规范靠拢,2.熟悉自己用得编译器 


总结:

为了我们的代码安全,养成良好的编码习惯,及时if后面只有一个语句,我们也要加上大括号,for循环也一样。


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在 Java 中,如果 if 语句只有一行代码,你可以不使用大括号。但是,为了避免可能的错误并且增强代码的可读性,最好还是加上大括号。 假如你不加大括号,那么当你添加第二行代码时,你可能会忘记加上大括号。这样就会导致控制流错误,因为第二行代码会被当作 if 语句的一部分,而不是与 if 语句无关的代码。 举个例子,假如你有如下代码: ``` if (a > b) c = a; d = b; ``` 如果你想让 d 的值等于 b,但是你忘认了加上大括号,那么代码会变成这样: ``` if (a > b) c = a; d = b; ``` 此时,d 的值会变成 a,因为 d 赋值语句被当作 if 语句的一部分。 因此,为了避免可能的错误,最好还是加上大括号。这样,即使你在以后添加了多行代码,也不会出现问题。 ### 回答2: 在Java中,if语句的作用是根据条件的真假来执行相应的代码块。即使if语句只有一行代码,也要加上大括号的原因有以下几点: 1. 代码的可读性:使用大括号可以使代码更加清晰易读。在if语句中加上大括号,可以明确标识出条件为真时需要执行的代码范围。 2. 避免错误:在if语句中只写一行代码时,如果不使用大括号,容易导致出错。当后续开发者想要在if语句增加更多代码时,可能会误以为只有一行代码是if语句的执行体,从而引发错误。 3. 代码规范:Java编码规范中明确要求使用大括号,即使只有一行代码。遵循这种规范可以提高代码的统一性和可维护性。 4. 避免语义歧义:如果if语句不加大括号,则条件为真时只会执行紧随其后的一行代码,容易导致语义歧义。使用大括号可以明确表达条件为真时需要执行的代码块,避免潜在的问题。 综上所述,即使if语句只有一行代码,为了代码的可读性、避免错误、遵循规范以及避免语义歧义,我们在Java中还是应该为if语句加上大括号。 ### 回答3: 在Java中,if语句的作用是根据条件的真假来决定是否执行特定的代码块。即使if语句只有一行代码,我们也要用大括号将其包围起来。这是因为使用大括号可以确保代码的清晰性和可读性。 第一,使用大括号能够明确if语句的代码块范围。在代码块中可以包含多行代码,而不仅仅是一行。如果if语句只有一行代码而没有使用大括号,那么可能会引发一些问题。比如,在添加新的代码时,容易忘记加入大括号,导致新添加的代码误认为是if语句的一部分。这样会产生逻辑错误或者导致代码执行不符合预期。 第二,使用大括号可以提高代码的可读性和可维护性。通过使用大括号,我们可以清楚地看到哪些代码是if语句的代码块。这对于团队合作的项目或者日后的代码维护非常重要。在调试和修改代码时,大括号能够减少错误和混淆,使代码更易于理解和维护。 第三,使用大括号营造了一致的代码风格。在Java编程中,有一些常用的编码规范,比如Google编码风格,都要求使用大括号将if语句的代码块包围起来。遵守这些规范可以使代码更具统一性,提高代码的可读性,并且方便其他开发者理解和修改代码。 综上所述,尽管if语句只有一行代码,但为了确保代码的清晰性、可读性和可维护性,我们应该始终使用大括号将其包围起来。这是良好的编程习惯,能够减少错误并提高代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值