使用三元运算符时未分配的变量错误

时间:2016-06-26 04:18:57

标签: java string

public static void main(String[] args) {        
    Scanner in = new Scanner(System.in);       
    String s = in.nextLine();         
    String l,b;         
    for(int i=0;i<(s.length()-2);i++) {
    if(i==0) {
        l=s.substring(i,i+3);     
        s.substring(i,i+3).compareTo(s.substring(i+1,i+4))>0
          ? l=s.substring(i,i+3)
          : l=s.substring(i+1,i+4); // assigned values
        s.substring(i,i+3).compareTo(s.substring(i+1,i+4))<0
          ? b=s.substring(i,i+3)
          : b=s.substring(i+1,i+4);
    }

为什么它显示变量i和b未分配?

2 个答案:

答案 0 :(得分:0)

首先, 无法 嵌套三分配给lb,就像您似乎想要做的那样(而且您似乎也 尝试 并为两者分配相同的值。您可以在循环之前执行此操作,如

b = l = s.substring(0, 3).compareTo(s.substring(1, 4)) > 0 ? 
        s.substring(0, 3) : s.substring(1, 4);

然后将您的初始循环条件设为1,如

for (int i = 1; i < (s.length()-2); i++) {
    // ...
}

如果循环从0开始,则无需测试1

答案 1 :(得分:0)

三元表达&#39;目的是返回值。具体而言,表达式具有从两个可能值中选择的值,具体取决于条件。然后可以在任何其他表达式可以使用的任何地方使用该值,例如

x = (isSomeTestTrue()) ? 2 : 5;
System.out.println((isSomeOtherTestTrue()) ? "this" : "that");

您尝试使用它代替if声明。也就是说,您要在?:部分放置有效的语句,并忽略表达式的值:

s.substring(i,i+3).compareTo(s.substring(i+1,i+4)) > 0
    ? l = s.substring(i,i+3)
    : l = s.substring(i+1,i+4);
不要这样做。这不是三元表达式的用途。并且它不会一直有效(我认为使用这样的三元表达式可能不足以满足l的明确赋值和规则的规则,尽管规则是很复杂,我还在努力解决这些问题。注意:在某些语言中,这可能是可接受的习惯用法,例如Perl或JavaScript。但我认为你不应该用Java或C#来做这件事。

如果您有两个语句,并且您希望在条件为真时执行一个语句,而另一个语句为假,则使用if

if (s.substring(i,i+3).compareTo(s.substring(i+1,i+4)) > 0) {
    l = s.substring(i, i+3);
} else {
    l = s.substring(i+1, i+4);
}

或者,在这种情况下,您可以使用三元运算符并将结果分配到l

l = (s.substring(i, i+3).compareTo(s.substring(i+1, i+4)) > 0)
        ? s.substring(i, i+3)
        : s.substring(i+1, i+4);