산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 어설션

자바 어설션

이 튜토리얼에서는 예제를 통해 Java assert 문(Java assertions)에 대해 알아봅니다.

자바의 어설션은 우리가 사실이라고 가정하는 코드를 테스트하여 버그를 감지하는 데 도움이 됩니다.

어설션은 assert을 사용하여 만들어집니다. 키워드.

구문은 다음과 같습니다.

assert condition;

여기 condition 프로그램이 실행될 때 참이라고 가정하는 부울 표현식입니다.

<시간>

어설션 활성화

기본적으로 어설션은 비활성화되어 런타임에 무시됩니다.

주장을 활성화하기 위해 다음을 사용합니다:

java -ea:arguments

또는

java -enableassertions:arguments

어설션이 활성화되고 조건이 true인 경우 , 프로그램이 정상적으로 실행됩니다.

그러나 조건이 false로 평가되는 경우 어설션이 활성화된 동안 JVM은 AssertionError를 발생시킵니다. , 프로그램이 즉시 중지됩니다.

<시간>

예제 1:자바 어설션

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length == 2;
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}

출력

There are 3 weekends in a week

이 프로그램에는 컴파일 오류가 없고 기본적으로 어설션이 비활성화되어 있기 때문에 위의 출력을 얻습니다.

어설션을 활성화한 후 다음과 같은 출력을 얻습니다.

Exception in thread "main" java.lang.AssertionError
<시간>

다른 형태의 주장 진술

assert condition : expression;

이 형식의 주장문에서 표현식은 AssertionError의 생성자에 전달됩니다. 물체. 이 표현식에는 조건이 false인 경우 오류의 세부사항 메시지로 표시되는 값이 있습니다. .

상세 메시지는 문제 디버깅에 도움이 되도록 어설션 실패 정보를 캡처하고 전송하는 데 사용됩니다.

<시간>

예제 2:표현식 예제가 있는 Java 어설션

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length==2 : "There are only 2 weekends in a week";
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}

출력

Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week

위의 예에서 볼 수 있듯이 표현식은 AssertionError의 생성자에 전달됩니다. 물체. 가정이 false인 경우 어설션이 활성화되면 적절한 메시지와 함께 예외가 발생합니다.

이 메시지는 어설션 실패의 원인이 된 오류를 진단하고 수정하는 데 도움이 됩니다.

<시간>

특정 클래스 및 패키지에 대한 어설션 활성화

어설션 명령줄 스위치에 인수를 제공하지 않으면

java -ea

이렇게 하면 시스템 클래스를 제외한 모든 클래스에서 어설션이 활성화됩니다.

또한 인수를 사용하여 특정 클래스 및 패키지에 대해 어설션을 활성화할 수 있습니다. 이러한 명령줄 스위치에 제공할 수 있는 인수는 다음과 같습니다.

클래스 이름에서 어설션 사용

프로그램 Main의 모든 클래스에 대해 어설션을 활성화하려면

java -ea Main

하나의 클래스만 활성화하려면

java -ea:AnimalClass Main

이렇게 하면 AnimalClass에서만 어설션이 활성화됩니다. Main 프로그램.

패키지 이름에 어설션 사용

패키지 com.animal에 대한 어설션을 활성화하려면 및 하위 패키지만,

java -ea:com.animal... Main

이름 없는 패키지에서 어설션 사용

현재 작업 디렉토리에서 이름 없는 패키지(패키지 문을 사용하지 않을 때)에서 어설션을 활성화하려면

java -ea:... Main

시스템 클래스에서 어설션 사용

시스템 클래스에서 어설션을 활성화하기 위해 다른 명령줄 스위치를 사용합니다.

java -esa:arguments 

또는

java -enablesystemassertions:arguments

이러한 스위치에 제공할 수 있는 인수는 동일합니다.

<시간>

어설션 비활성화

주장을 비활성화하려면 다음을 사용합니다.

java -da arguments 

또는

java -disableassertions arguments

시스템 클래스에서 어설션을 비활성화하려면 다음을 사용합니다.

java -dsa:arguments

또는

java -disablesystemassertions:arguments

주장을 비활성화하는 동안 전달할 수 있는 인수는 활성화하는 동안과 동일합니다.

<시간>

어설션의 장점

  1. 빠르고 효율적으로 버그를 감지하고 수정합니다.
  2. 어설션 확인은 개발 및 테스트 중에만 수행됩니다. 프로그램 실행이 느려지지 않도록 런타임 시 프로덕션 코드에서 자동으로 제거됩니다.
  3. 보일러플레이트 코드를 제거하고 코드 가독성을 높이는 데 도움이 됩니다.
  4. 코드가 올바르게 작동한다는 확신을 갖고 코드를 리팩터링하고 최적화합니다.
<시간>

어설션을 사용하는 경우

1. 연결할 수 없는 코드

도달할 수 없는 코드는 프로그램을 실행하려고 할 때 실행되지 않는 코드입니다. 어설션을 사용하여 연결할 수 없는 코드가 실제로 연결할 수 없는지 확인합니다.

예를 들어보겠습니다.

void unreachableCodeMethod() {
  System.out.println("Reachable code");
  return;
  // Unreachable code
  System.out.println("Unreachable code");
  assert false;
}

기본 케이스가 없는 switch 문의 다른 예를 들어 보겠습니다.

switch (dayOfWeek) {
  case "Sunday":
    System.out.println("It’s Sunday!");
    break;
  case "Monday":
    System.out.println("It’s Monday!");
    break;
  case "Tuesday":
    System.out.println("It’s Tuesday!");
    break;
  case "Wednesday":
    System.out.println("It’s Wednesday!");
    break;
  case "Thursday":
    System.out.println("It’s Thursday!");
    break;
  case "Friday":
    System.out.println("It’s Friday!");
    break;
  case "Saturday":
    System.out.println("It’s Saturday!");
    break;
}

위의 switch 문은 요일이 위의 7개 값 중 하나만 될 수 있음을 나타냅니다. 기본 케이스가 없다는 것은 프로그래머가 이러한 케이스 중 하나가 항상 실행될 것이라고 믿는다는 것을 의미합니다.

그러나 가정이 실제로 거짓인 경우 아직 고려되지 않은 경우가 있을 수 있습니다.

이 가정은 어설션을 사용하여 기본 스위치 케이스에 도달하지 않았는지 확인해야 합니다.

default:
    assert false: dayofWeek + " is invalid day";

dayOfWeek인 경우 유효한 날짜가 아닌 다른 값이 있습니다. AssertionError 던져집니다.

<시간>

2. 가정 문서화

기본 가정을 문서화하기 위해 많은 프로그래머가 주석을 사용합니다. 예를 들어보겠습니다.

if (i % 2 == 0) {
    ...
} else { // We know (i % 2 == 1)
    ...
}

대신 주장을 사용하십시오.

댓글은 프로그램이 성장함에 따라 오래되고 동기화되지 않을 수 있습니다. 그러나 assert을 업데이트해야 합니다. 진술; 그렇지 않으면 유효한 조건에서도 실패할 수 있습니다.

if (i % 2 == 0) {
   ...
} else {
    assert i % 2 == 1 : i;
    ...
}
<시간>

어설션을 사용하지 않는 경우

1. 공개 메서드의 인수 확인

공개 메서드의 인수는 사용자가 제공할 수 있습니다.

따라서 이러한 인수를 확인하는 데 어설션이 사용되면 조건이 실패하고 AssertionError이 될 수 있습니다. .

어설션을 사용하는 대신 적절한 런타임 예외가 발생하고 이러한 예외를 처리하도록 하십시오.

<시간>

2. 프로그램 작업에 영향을 주는 표현식을 평가하려면

어설션 조건에서 나중에 프로그램 작업에 영향을 줄 수 있는 메서드를 호출하거나 예외를 평가하지 마십시오.

평일 목록의 예를 들어보겠습니다. 한 주의 모든 요일 이름을 포함합니다.


ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));

ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));

assert weekdays.removeAll(weekends);

여기에서 Saturday 요소를 제거하려고 합니다. 및 Sunday ArrayList 평일에서 .

어설션이 활성화되면 프로그램이 제대로 작동합니다. 그러나 어설션이 비활성화된 경우 목록의 요소는 제거되지 않습니다. 이로 인해 프로그램이 실패할 수 있습니다.

대신 결과를 변수에 할당한 다음 해당 변수를 어설션에 사용하십시오.

ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));

ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));

boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;

이러한 방식으로 모든 주말 평일에서 삭제됩니다. 어설션이 활성화되거나 비활성화되는지 여부에 관계없이. 따라서 향후 프로그램 운영에 영향을 미치지 않습니다.


java

  1. 자바 연산자
  2. 자바 주석
  3. 자바 if...else 문
  4. 자바 for-each 루프
  5. 자바 문자열
  6. 자바 인터페이스
  7. 자바 익명 클래스
  8. 자바 리소스 사용
  9. 자바 주석
  10. 자바 벡터