자바 보안 인 코딩 안내: 표현 식 규칙
자바 작성 과정 에서 우 리 는 다양한 표현 식 을 사용 할 것 입 니 다. 표현 식 을 사용 하 는 과정 에서 어떤 안전 문제 가 우리 가 주의해 야 합 니까?같이 보 자.
표현 식 의 반환 값 에 주의 하 십시오.
우 리 는 JDK 라 이브 러 리 를 사용 할 때 JDK 의 방법의 의미 와 반환 값 을 진지 하 게 읽 어야 한다.
일부 반환 값 은 이 작업 이 성 공 했 는 지, 어떤 반환 값 은 방법 작업 의 결과 일 수 있 습 니 다.우 리 는 두 가지 흔히 볼 수 있 는 예 를 본다.
public void deleteFileWrong(){
File file= new File("/tmp/www.flydean.com.txt");
file.delete();
System.out.println("File delete success!");
}
public void deleteFileRight(){
File file= new File("/tmp/www.flydean.com.txt");
if(file.delete()){
System.out.println("File delete success!");
}
}
먼저 파일 삭제 의 예 를 보 세 요. delete 방법 은 반환 값 이 있 기 때문에 delete 방법 을 호출 한 후에 반환 값 을 판단 하여 삭제 에 성 공 했 는 지 확인 해 야 합 니 다.
일반적인 String 에서 문자 가 바 뀌 는 예 를 다시 봅 니 다:
public void stringReplaceWrong(){
String url="www.flydean.com";
url.replace("www","WWW");
System.out.println("replaced url..."+url);
}
public void stringReplaceRight(){
String url="www.flydean.com";
url=url.replace("www","WWW");
System.out.println("replaced url..."+url);
}
String 은 가 변 적 이지 않 기 때문에 replace 방법 은 교 체 된 String 을 되 돌려 줍 니 다. 그러나 원래 String 은 변 하지 않 기 때문에 반환 값 을 다시 할당 해 야 합 니 다.
NullPointerException 을 피하 세 요.
NullPointer Exception 은 가장 흔히 볼 수 있 는 운행 시 이상 일 것 입 니 다.어떻게 이 이상 을 피 합 니까?
우리 가 해 야 할 일 은 object 를 호출 하 는 방법 일 때 이 object 가 비어 있 는 지 아 닌 지 를 판단 하 는 것 이다.
JDK 8 이후 우 리 는 Stream 작업 을 도입 했다.
public void streamWrong(Collection<Object> collection){
collection.stream().filter(obj->obj.equals("www.flydean.com"));
}
Stream 작업 을 하 는 과정 에서 stream 의 요소 가 비어 있 는 지 주의해 야 합 니 다.
때때로 우 리 는 이미 판단 이 비 었 다 고 생각 할 수 있 지만 조건 판단 이 정확 하지 않 아 미 지 의 이상 을 초래 할 수 있다. 다음 과 같은 예 를 보 자.
public int countWrong(Collection<Object> collection, Object object){
int count=0;
if(collection ==null){
return count;
}
for(Object element: collection){
if((element ==null && object== null)
|| element.equals(object)){
count++;
}
}
return count;
}
이 예 는 collection 에 얼마나 많은 요소 가 object 와 같 는 지 찾 는 것 입 니 다. 둘 다 비어 있 으 면 똑 같이 기록 합 니 다.
그러나 위의 예 에 구멍 이 있 습 니 다. element = null, object 를 고려 하지 않 았 습 니 다! =null 의 경우 NullPointer Exception 이 생 성 됩 니 다.
우 리 는 이렇게 수정 해 야 한다.
public int countRight(Collection<Object> collection, Object object){
int count=0;
if(collection ==null){
return count;
}
for(Object element: collection){
if((element ==null && object== null)
|| (element !=null && element.equals(object))){
count++;
}
}
return count;
}
배열 이 같은 판단.
만약 우리 가 두 배열 이 같은 지 비교 해 야 한다 면, 사실은 우리 가 비교 하고 싶 은 것 은 두 배열 의 요소 가 같은 지 하 는 것 이다.
우 리 는 배열 이 특수 한 Object 라 는 것 을 알 고 있 습 니 다. 그러면 배열 대상 도 equals 방법 이 있 습 니 다. 다음 의 예 를 고려 하 십시오.
public boolean compareWrong(){
int[] array1 = new int[10];
int[] array2 = new int[10];
return array1.equals(array2);
}
결 과 는 false 입 니 다. 배열 은 Object 에서 정의 하 는 equals 방법 을 직접 사 용 했 기 때문에 이 방법의 정 의 를 보 겠 습 니 다.
public boolean equals(Object obj) {
return (this == obj);
}
이 방법 은 두 주소 가 같은 지 비교 해 볼 수 있다.그래서 우 리 는 false 결과 에 이 르 렀 다.
사실, 우 리 는 Arrays. equals 도구 류 의 방법 으로 두 배열 의 비 교 를 할 수 있 습 니 다.
public boolean compareRight(){
int[] array1 = new int[10];
int[] array2 = new int[10];
return Arrays.equals(array1, array2);
}
기본 유형의 패 키 징 클래스 간 비교
자바 에서 우 리 는 boolean, byte, char, short, int 와 같은 기본 적 인 유형 이 있다 는 것 을 알 고 있 습 니 다.
우 리 는 기본 유형의 값 을 패키지 유형 에 직접 할당 할 수 있 으 며, 패키지 유형 은 스스로 전환 할 수 있 습 니 다.
아래 의 예 를 고려 하 다.
Boolean boolA=true;
Boolean boolB=true;
System.out.println(boolA==boolB);
결 과 는 얼마 일 까요?
답 은 트 루.왜 두 개의 서로 다른 대상 의 비 교 는 true 일 까요?
이 질문 에 대답 하기 전에 문자열 의 비 교 를 살 펴 보 자.
String stringA="www.flydean.com";
String stringB="www.flydean.com";
System.out.println(stringA==stringB);
이것 은 우리 모두 가 알 고 있 을 것 입 니 다. String 은 문자열 상수 탱크 가 있 기 때문에 문자열 상수 에서 직접 구 축 된 String 대상 은 같은 대상 입 니 다.
마찬가지 로 불 리 언 과 바 이 트 는 기본 클래스 에서 직접 구축 하면 같은 대상 이다.
Character 의 경우 값 의 범위 가 \ u0000 to \ u007 f 이면 같은 대상 에 속 하고 이 범 위 를 넘 으 면 다른 대상 이다.
Integer 와 Short 의 경우 값 의 범위 가 - 128 and 127 이면 같은 대상 에 속 하고 이 범 위 를 넘 으 면 다른 대상 이다.
다음 의 예 를 다시 고려 하 다.
Boolean boolA=true;
Boolean boolC=new Boolean(true);
System.out.println(boolA==boolC);
출력 결 과 는 false 입 니 다. boolc 는 new 키 워드 를 사용 하여 새로운 대상 을 만 들 었 습 니 다.
집합 중 형식 이 일치 하지 않 습 니 다.
현재 자바 집합 은 지정 한 형식 을 통 해 특정 유형의 대상 만 저장 할 수 있 습 니 다.다음 의 예 를 고려 해 보 자.
public void typeMismatch(){
HashSet<Short> shortSet= new HashSet<>();
for(int i=0;i<10;i++){
shortSet.add((short)i);
shortSet.remove(i);
}
System.out.println(shortSet.size());
}
위의 코드 는 우리 가 Short 의 집합 을 정의 한 후에 0 - 9 를 추가 한 다음 에 우 리 는 reove 방법 으로 i 를 집합 에서 삭제 했다.
그러나 마지막 출력 결 과 는 10 으로 삭제 에 성공 하지 않 았 음 을 나타 낸다.왜 일 까요?
HashSet 의 remove 방법 보기:
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
reove 방법의 인 자 는 Object 입 니 다. 우리 가 들 어 온 i 는 int 형식 으로 short 와 일치 하지 않 아 삭제 에 실 패 했 습 니 다.
우 리 는 이렇게 수정 해 야 한다.
public void typeMatch(){
HashSet<Short> shortSet= new HashSet<>();
for(int i=0;i<10;i++){
shortSet.add((short)i);
shortSet.remove((short)i);
}
System.out.println(shortSet.size());
}
Asset 의 부작용
저 희 는 Asset 문 구 를 사용 하여 코드 에서 디 버 깅 을 하고 사용 하 는 과정 에서 Asset 문 구 는 시스템 의 업무 논리 에 부작용 을 일 으 키 지 않도록 주의해 야 합 니 다. 즉, Asset 문 구 를 실행 하지 않 더 라 도 코드 의 업무 논 리 를 수정 하지 않 습 니 다.
아래 의 예 를 보십시오.
public void assetWrong(ArrayList<Integer> list){
assert list.remove(0)>0;
}
위의 코드 는 list 에서 첫 번 째 요 소 를 삭제 하고 삭 제 된 요소 가 0 보다 큰 지 판단 합 니 다.
위의 코드 가 assert 문 구 를 실행 하지 않 으 면 업무 논리 도 실행 되 지 않 기 때문에 다음 과 같이 수정 해 야 합 니 다.
public void assetRight(ArrayList<Integer> list){
int result=list.remove(0);
assert result>0;
}
본문의 예:
learn-java-base-9-to-20/tree/master/security
본문 은 이미 수록 되 었 다.http://www.flydean.com/java-security-code-line-expresion/
가장 통속 적 인 해석, 가장 깊 은 건어물, 가장 간결 한 튜 토리 얼, 당신 이 모 르 는 작은 기술 들 이 당신 을 기다 리 고 있 습 니 다!
나의 공식 번호 에 관심 을 가 져 주 십시오. "프로그램 그런 일 들", 기술 을 알 고 당신 을 더 잘 알 고 있 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.