2016-03-19 33 views
0

Çalışma zamanında tuhaf bir java davranışıyla karşılaştım. Tüm bilgiler ekran görüntüsündedir. Uygulamamda başarısız. Şaşırtıcı bir şekilde, farklı zamanlarda aynı girdi verileriyle, doğru bir şekilde işlenebilir. Bu garip davranışın sebebinin ne olduğunu açıklayabilir misin? Birazdan sonuç pkgPart = "common.dto." olmalıdır id = "common.dto.IdsFilter"Garip Java davranışı

private String[] splitPackageAndNameParts(String id) { 
    // check string not empty 
    if (StringUtils.isEmpty(id)) { 
     throw new IllegalArgumentException("Unexpected id : " + id); 
    } 

    // get last point index 
    int index = id.lastIndexOf("."); 

    // check index 
    if (index == 0 || index >= (id.length() - 1)) { 
     throw new IllegalArgumentException("Unexpected id : " + id); 
    } 

    // split 
    String pkgPart = index < 0 ? "" : id.substring(0, index + 1); 
    String namePart = id.substring(index + 1, id.length()); 

    // return result 
    return new String[]{pkgPart, namePart}; 
} 

jdk 1.7.0_79 İşte tam kod parçayı kullanır, ancak çalışma zamanı üzerinde o "common.dto" (noktasız) döndürür Görebildiğim kadarıyla

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557 –

+0

Bize * gerçek kod * ihtiyacımız var. Bir ekran görüntüsüyle size yardımcı olamayız, çünkü neler olduğunu görmek için IntelliJ kopyalarımıza bunu takamıyoruz. – Makoto

+0

Lütfen açıklamak için cevabınızı düzenleyin: hangi girdi verilerini kullanırsınız, beklenen davranış nedir ve hangi hata mesajını alırsınız. Ve sahip olduğunuz kodu (ekran görüntüsü yok, ancak gerçek java kodu) gönderin, böylece size yardımcı olabiliriz. –

cevap

1

alt dizinizde birebir hataya benziyor. Yapmak istediğiniz şey, dahil olmak üzere en fazla kapsama alanıdır, bu da dönemin dizin noktasının yerini belirtir, çünkü bu, alt dizideki süreyi de içerir.

Basit değişiklik: Alt tabaka işleminden + 1'u kaldırın. Alternatif olarak, Java 8 ile, StringJoiner ve String#split kullanarak daha net bir yol vardır. Bu size ilk elemanı alacaktır; İkinci öğe, bölünmüş koleksiyondaki sonuncudur.

String[] split = pkg.split("\\."); 
final StringJoiner stringJoiner = new StringJoiner("."); 
for(int i = 0; i < split.length - 1; i++) { 
    stringJoiner.add(split[i]); 
} 
System.out.println(stringJoiner.toString()); 
+0

çalışan uygulamanın somut adımında çok teşekkürler! Ama bende aynı problem var. Alt tabaka işlemlerinden '+ 1 'kaldırdım, herhangi bir sorun olmadan testlerde gayet iyi çalışıyor. Ama şimdi '' 'çalışma zamanında' isimPart' içinde cevapsız. Ben değerlendiririm, doğru sonuç döndürür, ancak çalışma zamanında (ekran görüntüsünde aynı sorun) başarısız olur – jahra

+0

Ben girdi olarak "common.dto.IdsFilter" ile yönteminin ilk çağrı iyi çalışır ve doğru değeri döndürür . Ama eğer bu metodu ilk aramadan hemen sonra aynı '' common.dto.IdsFilter ''ile girdiysem yanlış sonuç verecektir. – jahra