Java에서 null 문자열을 연결 중
왜 다음과 같은 것이 작용하는가?A를 기대할 수 있다.NullPointerException
던질 것이다
String s = null;
s = s + "hello";
System.out.println(s); // prints "nullhello"
왜그것이 작동해야 하는가?
The
JLS 5, 섹션 15.18.1.1 JLS 8 § 15.18.1 "String Connectation Operator +"로 이어지는 JLS 8, § 5.1.11 "String Conversion"은 이 작업이 실패 없이 성공하도록 요구한다.
...이제 기준 값만 고려할 필요가 있다.참조가 null이면 문자열 "null"(ASCII 문자 n, u, l, l)로 변환된다.그렇지 않으면 인수가 없는 참조 객체의 toString 메서드를 호출하는 것처럼 변환을 수행하지만, toString 메서드를 호출한 결과가 null이면 문자열 "null"을 대신 사용한다.
어떻게 되는 겁니까?
바이트코드를 봅시다!컴파일러가 코드를 가져가는 경우:
String s = null;
s = s + "hello";
System.out.println(s); // prints "nullhello"
대신 이렇게 쓴 것처럼 바이트 코드로 컴파일하십시오.
String s = null;
s = new StringBuilder(String.valueOf(s)).append("hello").toString();
System.out.println(s); // prints "nullhello"
(사용하면 스스로 할 수 있다.)
의 추가 방법StringBuilder
모두 잘 처리한다.이 경우 때문에.null
첫 번째 논쟁이야String.valueOf()
StringBuilder에 임의의 참조 유형을 사용하는 생성자가 없기 때문에 대신 호출됨.
만약 당신이 했더라면s = "hello" + s
대신 동등한 코드는 다음과 같을 것이다.
s = new StringBuilder("hello").append(s).toString();
이 경우, 추가 방법이 null을 취한 후 다음을 위임한다.String.valueOf()
.
참고: 문자열 연결은 실제로 컴파일러가 수행할 최적화를 결정하는 드문 장소 중 하나이다.이와 같이 "정확한 등가" 코드는 컴파일러마다 다를 수 있다.이 최적화는 JLS, 섹션 15.18.1.2:
반복적인 문자열 연결의 성능을 높이기 위해 Java 컴파일러는 StringBuffer 클래스 또는 유사한 기술을 사용하여 표현식의 평가에 의해 생성되는 중간 문자열 개체의 수를 줄일 수 있다.
위의 "동등 코드"를 결정할 때 내가 사용한 컴파일러는 이클립스의 컴파일러인 ecj였다.
Java 언어 규격의 섹션 5.4 및 15.18을 참조하십시오.
문자열 변환은 인수 중 하나가 문자열일 때 이진 + 연산자의 피연산자에게만 적용된다.이 단일 특수한 경우, +에 대한 다른 인수는 문자열로 변환되며, 두 문자열의 결합인 새로운 문자열은 +의 결과물이다.문자열 변환은 문자열 연결 + 연산자의 설명 내에서 상세하게 지정된다.
그리고
하나의 피연산자 식만 String 유형인 경우, 다른 피연산자에 대해 문자열 변환을 수행하여 런타임에 문자열을 생성한다.결과는 두 피연산자 문자열의 결합인 컴파일 시간 상수식(제15.28)이 아닌 경우 문자열 객체에 대한 참조다.왼쪽 피연산자의 문자는 새로 만든 문자열에서 오른쪽 피연산자의 문자 앞에 나타난다.문자열 유형의 피연산자가 null이면 해당 피연산자 대신 "null" 문자열이 사용된다.
두 번째 줄은 다음과 같은 코드로 변환된다.
s = (new StringBuilder()).append((String)null).append("hello").toString();
추가 방법은 처리할 수 있다.null
논쟁들
당신은 "null"을 사용하지 않고 따라서 당신은 예외를 받지 않는다.NullPointer를 사용하려면
String s = null;
s = s.toString() + "hello";
그리고 나는 당신이 하고 싶은 것은
String s = "";
s = s + "hello";
이것은 자바 API의 방법에 명시된 동작이다.당신이 연결 수술을 할 때valueOf
를 얻는 데 사용된다.String
대변의오브젝트가 다음과 같은 경우 특별한 경우가 있다.null
이 , 이문자."null"
사용된다.
public static String valueOf(Object obj)
개체 인수의 문자열 표현을 반환한다.
매개변수: obj - 객체
반환:
인수가 null이면 "null"과 동일한 문자열, 그렇지 않으면 obj.toString() 값이 반환된다.
참조URL: https://stackoverflow.com/questions/4260723/concatenating-null-strings-in-java
'programing' 카테고리의 다른 글
v-select 또는 v-comobox에서 "모두 선택" 옵션을 사용하는 방법 (0) | 2022.04.25 |
---|---|
Axios 인터셉터 - vuex 스토어에서 응답을 반환하는 방법 (0) | 2022.04.25 |
JAXB를 사용하여 XML 문자열에서 개체 생성 (0) | 2022.04.25 |
Vue js 어레이로 문자열을 분할하고 목록 렌더러에서 사용하는 방법 (0) | 2022.04.25 |
일반 클래스의 정적 메서드? (0) | 2022.04.24 |