Сомневаюсь в логике if / else-if - PullRequest
0 голосов
/ 24 апреля 2009

Я использую следующий код

String sample = " : : ";
String[] splitTime = sample.split(":");
if ( splitTime[0].trim().equals("") ||
        splitTime[0].trim().equals(null)) {
      System.out.println("Inside Split 0");
      splitTime[0] = "0";
 } else if (splitTime[1].trim().equals("") ||
        splitTime[1].trim().equals(null)) {
      System.out.println("Inside Split 1");
      splitTime[1] = "0";
 }else if (splitTime[2].trim().equals("") ||
        splitTime[2].trim().equals(null)) {
      System.out.println("Inside Split2");
      splitTime[2] = "0";
 }

 System.out.println("Value 1 :"+splitTime[0]);
 System.out.println("Value 2 :"+splitTime[1]);
 System.out.println("Value 3 :"+splitTime[2]);

ВЫХОД:
Внутри Сплит 0
Значение 1: 0
Значение 2:
Значение 3:
Я не знаю, почему это не входит во второе и третье утверждение if-else. Кто-нибудь может мне помочь?

Ответы [ 5 ]

3 голосов
/ 24 апреля 2009

потому что, если первый оператор if истинен и, следовательно, выполняется, то остальные остальные if не выполняются. Если вы хотите выполнить другие операторы else-if, почему бы не переписать их как отдельные операторы if?

String sample = "::";
String[] splitTime = sample.split(":");
if ( splitTime[0].trim().equals("") ||
        splitTime[0].trim().equals(null)) {
      System.out.println("Inside Split 0");
      splitTime[0] = "0";
 }
 if (splitTime[1].trim().equals("") ||
        splitTime[1].trim().equals(null)) {
      System.out.println("Inside Split 1");
      splitTime[1] = "0";
 } 
 if (splitTime[2].trim().equals("") ||
        splitTime[2].trim().equals(null)) {
      System.out.println("Inside Split2");
      splitTime[2] = "0";
 }

 System.out.println("Value 1 :"+splitTime[0]);
 System.out.println("Value 2 :"+splitTime[1]);
 System.out.println("Value 3 :"+splitTime[2]);
2 голосов
/ 24 апреля 2009

Это из-за "else if".

Если у вас есть код, который делает:

if (a) {
} else if (b) {
} 

Тогда вторая ветвь никогда не может быть выполнена, если первая ветвь была.

Вместо этого вам нужно:

if (a) {
}

if (b) {
}

чтобы сделать условия независимыми.

Кстати, String.trim() не может вернуть null, и вы не гарантированно получите три элемента в выводе из String.split(). Потенциально лучший код будет:

String sample = " : : ";
String[] splitTime = sample.split(":");
for (int i = 0; i < splitTime.length; ++i) {
    splitTime[i] = splitTime[i].trim();
    if (splitTime[i].length() == 0) {
        splitTime[i] = "0";
    }
}
0 голосов
/ 01 декабря 2018

В вложенных операторах if-if, если один оператор выполняется, другие не выполняются. В вашем случае первое выражение if всегда истинно, поэтому оно выполняется и, следовательно, два других никогда не будут выполнены.

0 голосов
/ 25 апреля 2009

1001 * попробовать *

String sample = " 12 : 59 : 60 ";
// strip spaces and create up to 3 parts
String[] splitTime = sample.trim().split(" *: *", 3);
for (int i = 0; i < splitTime.length; i++)
    System.out.println("Inside " + i + " '" + splitTime[i] + '\'');

Печать

Inside 0 '12'
Inside 1 '59'
Inside 2 '60'
0 голосов
/ 24 апреля 2009

Это связано с фундаментальной операцией предложения If-Else:

if(foo) {
  // A
} else if(bar) {
  // B
}

Если foo равно true, A будет выполнено, а bar никогда не будет проверено. Чтобы получить семантику, которую вы хотите, рассмотрите возможность объединения блоков if:

if(foo){
  // A
}

if(bar) {
  // B
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...